java内存分区 jdk1.7之前

1、堆

基本所有对象都在堆上被创建,而对象的声明在栈中,它存着堆上的引用。例如 Object object = new Object();

object为对象的声明,存在虚拟机栈里面,新建的object对象存在于堆上面,包括类的成员变量。


2、虚拟机栈

虚拟机栈是线程私有的,不会出现线程安全问题,在sun公司提供的hotspot中和本地方法栈为一个栈,每次调用方法需要执行一个Frame(帧栈)的入栈到出栈的过程,每一个栈帧都有自己的局部变量表、操作数栈、返回地址和指向运行时常量池的引用。


3、本地方法栈

和虚拟机栈是一样的,只是里面执行的是jvm本地方法,申明为native的方法。


4、程序计数器

记录了每一个线程当前执行的代码行,线程私有的。


5、方法区(非堆)

jdk7版本:存的是类型信息,包括class被加载后的类名,属性,方法,静态变量等

jdk8版本:移除永久代,相当于把方法区变成了放在元空间中进行类的加载,静态成员变量和常量池移动至java堆中。



6、常量池(方法区里面)

存的是final的值,常量,就是在编译的时候就已经确定的值。


7、关于线程安全问题


猜你喜欢

转载自blog.csdn.net/qq_31489805/article/details/78509433