学习笔记-java内存分析
2013-06-06 20:45
429 查看
1.经典的jvm内存结构图(深入java虚拟机 2ed)
方法区 包含:该类的类型信息,该类型的常量池,方法字节码,静态变量
2.需要分析
1). 字面值
2).常量(类常量)
3).静态变量
4).字符串
5).数组
6).继承
7).多态
3.字面值
Java中的字面值常称为常量,可以是任何简单数据类型。java文件编译成class后,字面值存在方法中(指令集合中),嵌入到字节码中。
其中12,24,在class载入内存后,指令(方法)放在方法区中,当执行引擎执行 相应指令时,值放入 java栈中运算。
注意:java栈有个特点,共享数据。 ad=12,入栈过程。首先,在该线程的java栈中查找 12这个值,如果找到(前语句定义的),ad就是前面12的地址。如果没找到,在java栈上开辟新空间存入 12.(这个特点与栈的先进后出有关,我认为)。
4.常量
不可改变值。final修饰。
sd 字面值 常量,属于方法,保存如字面值一样。 fg是类的数据成员,保存在 常量池中。每个类都有一个常量池。
5.静态变量
类的静态变量,类载入jvm时,调用clinit()方法,把静态变量放入方法区中的静态区。 静态代码块也放在静态区。
6.字符串
字符串是编译时常量,放在常量池中。
String str=new String("abc");为什么创建两个对象。
每个字符串常量是String的实例,即一个对象。
在编译时,“abc”保存进class常量池,加载入jvm的方法区的常量池中。在运行时,new在堆中开辟空间,把常量池中“abc”转成字符数组,存入String的对象str的数据空间。所以创建两个对象,一个在常量池中,一个在堆中。
string 源代码:
private final char value[];
//把original转成字符数组 赋给 value.
public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}public String(String original) {
}
7.数组
栈中引用指向堆中数组对象。
8. 继承
子类中有父类的实例。
this指向本对象的地址。作用: 隐式参数,避免名字冲突,构造方法重载。
super关键字在java中的作用是使被屏蔽的成员变量或者成员方法变为可见。它不指向任何对象。
9. 多态
编译时,根据定义类型方法表检索。
运行时,根据实际对象的类型(this)。
总结:编译时变量,字面量嵌入字节码中,在栈中共享(方法中)。
String存的字符数组是final,是常量,放在常量池中,在常量池中共享(类中)。
static放在方法区中的静态区共享(类中)。
方法区 包含:该类的类型信息,该类型的常量池,方法字节码,静态变量
2.需要分析
1). 字面值
2).常量(类常量)
3).静态变量
4).字符串
5).数组
6).继承
7).多态
3.字面值
Java中的字面值常称为常量,可以是任何简单数据类型。java文件编译成class后,字面值存在方法中(指令集合中),嵌入到字节码中。
public static void main(String[] args) { int ad=12; final int sd=24; int add=123; }
其中12,24,在class载入内存后,指令(方法)放在方法区中,当执行引擎执行 相应指令时,值放入 java栈中运算。
注意:java栈有个特点,共享数据。 ad=12,入栈过程。首先,在该线程的java栈中查找 12这个值,如果找到(前语句定义的),ad就是前面12的地址。如果没找到,在java栈上开辟新空间存入 12.(这个特点与栈的先进后出有关,我认为)。
4.常量
不可改变值。final修饰。
sd 字面值 常量,属于方法,保存如字面值一样。 fg是类的数据成员,保存在 常量池中。每个类都有一个常量池。
5.静态变量
类的静态变量,类载入jvm时,调用clinit()方法,把静态变量放入方法区中的静态区。 静态代码块也放在静态区。
6.字符串
字符串是编译时常量,放在常量池中。
String str=new String("abc");为什么创建两个对象。
每个字符串常量是String的实例,即一个对象。
在编译时,“abc”保存进class常量池,加载入jvm的方法区的常量池中。在运行时,new在堆中开辟空间,把常量池中“abc”转成字符数组,存入String的对象str的数据空间。所以创建两个对象,一个在常量池中,一个在堆中。
string 源代码:
private final char value[];
//把original转成字符数组 赋给 value.
public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}public String(String original) {
}
7.数组
栈中引用指向堆中数组对象。
8. 继承
子类中有父类的实例。
this指向本对象的地址。作用: 隐式参数,避免名字冲突,构造方法重载。
super关键字在java中的作用是使被屏蔽的成员变量或者成员方法变为可见。它不指向任何对象。
9. 多态
编译时,根据定义类型方法表检索。
运行时,根据实际对象的类型(this)。
总结:编译时变量,字面量嵌入字节码中,在栈中共享(方法中)。
String存的字符数组是final,是常量,放在常量池中,在常量池中共享(类中)。
static放在方法区中的静态区共享(类中)。
相关文章推荐
- 2015.09.01 Java 学习笔记—内存分析精华
- JAVA学习笔记之继承和父类子类实例变量的初始化内存分析图
- 黑马程序员--Java基础学习笔记之抽象类和接口、内存结构分析、Java APIs
- java学习笔记-java jvm内存结构分析
- Java学习笔记-类与对象(对象内存分析)
- Java 学习笔记 (13) - 基本内存分析 和 垃圾回收机制
- Java学习笔记-JVM内存分析
- java学习笔记_内存分析
- 编程学习笔记之java相关::内存回收原理
- nginx 源码学习笔记(七)——内存分配相关源码分析
- 韩顺平 javascript教学视频_学习笔记9_js函数调用过程内存分析_js函数细节
- java.util.BitSet 详细分析 学习笔记
- 《Thinking in Java 》学习笔记 --- Java内存分配,对象存放到什么地方?怎么放?
- JVM内存大小设置[JAVA学习笔记]
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第26讲_js函数调用过程内存分析_js函数细节_学习笔记_源代码图解_PPT文档整理
- Java学习之类加载全过程_JVM内存分析_反射机制核心原理_常量池理解
- java多线程之内存可见性学习笔记
- java 内存学习笔记 一(内存划分与功能说明)
- Java IO学习笔记(五):内存操作流
- (Java2D 学习笔记系列) (一)一个简单的图像填充实例及其分析理解