Java内存图的学习
方法区:存放代码片段,静态代码块(static修饰的变量),常量池(JDK1.8以前)。
堆内存空间:存放对象,元数据空间(JDK1.8以后)。
栈内存空间:存放方法栈针,局部变量。操作:方法压栈,方法弹栈。
栈内存中的引用类型变量存在于栈中,但它的实际的值来自于堆中。它仅保存堆中的对象的首地址,也就是这个引用类型变量在栈中引用了堆中的对应类型的对象。
一个引用类型对象的举例:
Person per = new Person();
假设这句代码出现在方法体中,那:
1:包含这个方法体的类首先被加载到方法区中,各项常量存入常量区。
2:先在栈中执行main方法,并压栈。方法体本身被压栈进虚拟机栈;
3:“Person per”将会反映到虚拟机栈的本地变量表中。
4:而“new Person()”将会反映到Java 堆内存空间中,形成一块存储了Person类型所有实例数据值的结构化内存,这块内存的地址存储在虚拟机栈。再将这块内存的首地址传向栈内存空间中的,当栈中per运行时就会通过地址找到堆中。当各个方法顺序执行完,就会按顺序弹栈。堆内存空间中不再使用的内存需要通过其他方法自行清理。
(本人是在java求学路上的一棵小草,如有错误的地方,感谢斧正!)