JVM的内存化分为5大区域,它们分别是 方法区,堆,虚拟机栈,本地方法栈,程序计数器。
其中,堆和方法区是线程公有的。虚拟机栈,本地方法栈,程序计数器是线程私有的。
1.程序计数器
程序计数器是当前线程执行的行的指示器,计数器的值用来指向下一条需要执行的字节码指令。
2.JAVA虚拟机栈
JAVA虚拟机栈的生命周期和线程的生命周期相同。每一个方法的执行,都会创建一个栈帧用于存储局部变量表,操作数栈方法出口等,每一个方法的调用直到执行完毕都会伴随着在虚拟机栈中入栈和出栈的一个过程。
这是一个栈帧的结构。
3.本地方法栈
本地方法栈的作用和JAVA虚拟机栈的作用差不多,虚拟机栈执行的是JAVA方法,本地方法栈执行被Native修饰的方法。native修饰的方法是用C++编写的。
4.堆
堆是虚拟机最大的一块,在虚拟机启动时就创建。堆是垃圾回收机制主要管理的区域。堆的划分为新生代和老年代,将新生代细分为Eden空间,From Survivor,To Survivor。这样划分主要是为了方便的回收对象,创建对象会创建在Eden空间和一个Survivor,当回收时,将Eden空间和Survivor中存活的对象复制到另一快Survivor空间上,最后清理掉Eden空间和刚才调用过的Survivor空间。Eden空间和Survivor空间的比例是8:1(采用的是复制算法)。存活在Survivor中的对象每发生一次GC年龄就加1.当年龄到达60(可设置)时就会从新生代移至老年代。
5.方法区
方法区(使用永久代进行管理)用于存储类信息,常量,静态变量,编译后的代码,运行常量池。常量池用于存放编译期间生成的符号的引用,这部分内容在类加载后进入运行常量池。
网友评论