Java的内存分析
-- 栈中存放局部变量
局部变量:方法的参数,或者方法{}内部的变量
作用域:一旦超出作用域,立刻从栈内存当中消失。
-- 堆
凡是new出来的东西,都放在堆当中。
堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值。规则:
如果是整数 默认值为0
如果是浮点数 默认值为0.0
如果是字符 默认值为‘\u0000’
如果是布尔 默认值为false
如果是引用类型 默认值为null
-- 方法区
存储.class相关信息,包含方法的信息。
常量池、static final 修饰的成员变量都存储于方法区中
在类加载的时候,会将静态内容也加载到方法区的静态域中,静态域的内容先于对象存在,这个静态内容被所有的对象共享
解析:
- 首先执行main方法,会在栈中开辟一个main栈桢
- 在遇到Person时,会先加载它的字节码信息Person.class
- 执行等于后面的Person对象(对象放在堆中),为其赋一个地址值,这个对象中由三个成员变量,分别为这三个变量开辟内存初始化,int类型默认是0,字符串默认是null
- 去执行Person的构造器,就去去找Person方法,如何为这个方法开辟一个构造器栈桢,将a、b、c三个局部变量分别存入到栈中,为其赋值(基本数据类型赋值时直接传值,引用数据类型赋值时,它首先会把值放到字符串常量池里,它对应有一个地址,然后将这个地址赋给变量)a=1,b=20,c=地址值。
- 将abc的值分别赋值到堆中的变量,这个方法就结束了,一旦结束,这个方法就会从栈内存中消失
- 会在main方法中将p存入,把堆中对象的地址值赋给p,到此,程序就结束了