关于JavaSE内存分析的体会
首先大家要明白一些基本概念:
栈空间(stack):栈分配一组连续的存储空间,遵循先进后出(FILO),可以结合数据结构中的栈来理解。栈属于线程私有,不能被共享,所有JVM为每个线程创建一个栈,用于存放该线程执行的方法的信息。
堆空间(heap):不同于数据结构中的堆,这里的分配的是不连续的存储空间。用于存放创建好的数组和对象,且堆只有一个,被所有线程共享,运算速度较慢。
方法区(method):又称静态区,JVM中只有一个方法区,被所有线程共享,本质也是堆空间。方法区是专门用来存储类,常量的相关信息的。内容是永远不变的。
成员变量可不初始化,系统会自动初始化;
局部变量必须由程序员显式初始化,系统不会自动初始化。
实例分析:
class Person{
String name;
int age;
static String company="Google";
public void show(){
System.out.println("姓名"+name+""+age);
}
}
public class TestPerson{
public static void main(String[] args){
Person p1 =new Person();
p1.age = 24;
p1.name="张三";
p1.show();
Pesrson p2 = new Person();
p2.page = 35;
p2.name="李四";
p2.show();
}
}
静态属性和show方法被放在方法区内,方法区还存放着一些字符串常量
通过new在堆内存中分配一些内存,通过构造函数进行初始化,然后把获得的地址赋值p1,就实现了对象的实例化
不难看出堆中的一些字符串是指向方法区的一些常量的