关于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();
    }
}

关于JavaSE内存分析的体会

 静态属性和show方法被放在方法区内,方法区还存放着一些字符串常量

通过new在堆内存中分配一些内存,通过构造函数进行初始化,然后把获得的地址赋值p1,就实现了对象的实例化

不难看出堆中的一些字符串是指向方法区的一些常量的