1、堆
基本所有对象都在堆上被创建,而对象的声明在栈中,它存着堆上的引用。例如 Object object = new Object();
object为对象的声明,存在虚拟机栈里面,新建的object对象存在于堆上面,包括类的成员变量。
2、虚拟机栈
虚拟机栈是线程私有的,不会出现线程安全问题,在sun公司提供的hotspot中和本地方法栈为一个栈,每次调用方法需要执行一个Frame(帧栈)的入栈到出栈的过程,每一个栈帧都有自己的局部变量表、操作数栈、返回地址和指向运行时常量池的引用。
3、本地方法栈
和虚拟机栈是一样的,只是里面执行的是jvm本地方法,申明为native的方法。
4、程序计数器
记录了每一个线程当前执行的代码行,线程私有的。
5、方法区(非堆)
jdk7版本:存的是类型信息,包括class被加载后的类名,属性,方法,静态变量等
jdk8版本:移除永久代,相当于把方法区变成了放在元空间中进行类的加载,静态成员变量和常量池移动至java堆中。
6、常量池(方法区里面)
存的是final的值,常量,就是在编译的时候就已经确定的值。
7、关于线程安全问题