1、堆

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

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


2、虚拟机栈

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


3、本地方法栈

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


4、程序计数器

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


5、方法区(非堆)

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

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



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

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


7、关于线程安全问题


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐