详细内容参考《深入理解Java虚拟机 JVM高级特效与最佳实践》
1.1 类加载子系统
1.2 方法区(Method Area)
(1)线程共享。
(2)存储已被虚拟机加载的类信息(版本、字段、方法、接口)、常量、静态变量、即使编译器编译后的代码等数据。
(3)运行时常量池(Runtime Constant Pool)。
(4)当方法区无法满足内存分配需求时,将抛出OutOfMemoryErrory异常。
1.3 堆(Java Heap)
(1)线程共享,虚拟机启动是创建。
(2)存储对象实例、数组等引用类型变量。
(3)垃圾回收的主要区域。
(4)主流虚拟机都是按照可拓展来实现的(通过-Xms和-Xmx控制)。如果堆内存已耗尽并且无法拓展时,会抛出OutOfMemoryError异常。
1.4 虚拟机栈(Java Virtual Machine Stacks)
(1)线程私有
(2)虚拟机栈描述Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。没一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
(3)局部变量表存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、long、float、double)、对象引用(reference类型)和returnAddress类型。其中long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用一个。
(4)在这个区域如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态拓展,当拓展时无法申请到足够的内存时会抛出OutOfMemoryError异常。
1.5 本地方法栈
(1)与虚拟机栈类似,区别是本地方法栈是为虚拟机执行Native方法服务的。
(2)Native方法说明:被native关键字声明的方法说明该方法不是以Java语言实现的,而是以本地语言实现的,Java可以直接拿来用。
(3)存在StackOverflowError、OutOfMemoryError异常。
1.6 程序计数器/PC寄存器(Program Counter Register)
(1)线程私有。
(2)可以看做当前线程所执行的字节码的行号指示器。
(3)不会出现OutOfMemoryError(OOM)异常。
1.7 直接内存(Direct Memory)
(1)和服务器实际内存有关。
(2)可能出现OutOfMemoryError(OOM)异常
1.8 垃圾回收系统
1.9 执行引擎