JVM规范的内存区域:


JVM Specification中规定的内存区域包括:程序计数器、Java栈、本地方法栈、方法区、堆。
1. 程序计数器
- 记录了当前线程运行的字节码的行数。
- 线程私有。
2. 栈
- 线程私有,生命周期和线程相同。
- 栈帧:入栈和出栈的基本单元。一个栈帧对应一个方法的调用,并随着方法的结束而消亡。它是一种数据结构,其中保存了方法运行的局部变量、操作数栈、动态连接、方法的返回地址。
- 当线程调用一个Java方法,JVM会创建一个栈帧,并压入到栈中。当方法运行完毕,则将栈帧从栈中弹出。
3. 本地方法栈
- 线程私有。
- 和Java方法不同,调用native方法时,不会在栈中压入栈帧,而是通过动态连接直接调用本地方法。
4. 堆
- 所有线程共享。
- 所有对象实例和数组存放地。
- GC。
5. 方法区
- 线程共享。
- 类信息、常量、静态变量、编译后代码。
- 是JVM规范中的一个逻辑分类,在实际HotspotJVM中,根据JDK版本不同,实现也不尽相同。JDK6及以前对应永久代,JDK7中将常量和静态变量(移到了Class对象中)从永久代移到了堆中,而JDK8则彻底删除了永久代,增加了元空间。自此方法区虽然还是一个逻辑分区,但是实际实现已经是四分五裂。
网友评论