文章目录
一、总览
二、堆Heap(共享)
线程共享区域
除G1,ZGC等新一代垃圾回收器外,使用传统的垃圾回收器时,堆区分为新生代和老年代,默认情况下,新生代占用1/3,老年代占用2/3。其中,新生代又分为一个Eden区和两个Survivor区,默认情况下,Eden区占8/10,两个Survivor区各占1/10。
三、方法区Method Area(共享)
方法区是《JAVA虚拟机规范》中的一个抽象概念,
JDK1.8
之前,HotSpot
虚拟机对方法区的实现是永久代(Perm Space),JDK1.8
开始,对方法区的实现是元空间(Meta Space)。
方法区的两个实现永久代
和元空间
之间的区别:
永久代 | 元空间 | |
---|---|---|
空间大小 | 启动是通过-XX:MaxPermSize 参数指定大小,程序运行期间空间大小固定不变 | 无需指定大小,在运行期间动态增长,受限于物理内存 |
回收情况 | Full GC 不会回收垃圾对象 | Full GC 会回收垃圾对象 |
存储数据 | 类型信息、常量、静态变量、即时编译后的代码缓存等 | 主要是类型信息(运行时常量池) |
实现细节 | 把堆区的分代设计扩展至方法区 | 由本地内存(Native Memory)实现 |
四、虚拟机栈VM Stacks
虚拟机栈是线程私有的,每个Java线程都有自己的虚拟机栈,其生命周期与线程相同。每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储方法的局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
对于非静态方法的栈帧,局部变量表中的第一个参数是当前对象this指针。
五、本地方法栈Native Method Stacks
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则是为虚拟机使用到的本地方法(C/C++实现)服务。
六、程序计数器Program Counter Register
程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器来完成。