JVM(Java Virtual Machine)
1.JVM介绍
- Java虚拟机是Java平台的基石。
- Java虚拟机不能解释Java编程语言,它只知道一种特定的二进制格式,即类文件格式。类文件包含Java虚拟机指令(或者说字节码)和符号表,以及其他辅助信息。
2.JVM内存划分
- JVM内存分为两大类:堆内存和非堆内存。
- 堆内存:它存储了类实例和数组,直到被回收
- 非堆内存:code cache,Compressed class space,Metaspace等
使用NMT报告的JVM内存使用情况:
如您所见,非堆内存占JVM内存使用的绝大部分,而堆内存仅占总数的六分之一
3.本机内存区域
- Compressed class space(压缩的类空间):用于存储有关已加载类的信息。可以理解为一个已加载的类数的函数,受
-XX:MaxMetaspaceSize
约束。默认情况下是元空间(Metaspace
)的一部分 - Thread(线程):JVM中的线程使用的内存,在虚拟机栈中分配。
- code cache(代码缓存):JIT用于存储其输出的内存。一个已加载的类数的函数。受
ReservedCodeCacheSize
约束。例如可以通过将JIT调整禁用分层编译来减少。 - GC:存储GC使用的数据。取决于使用哪个垃圾收集器。
- Symbol:存储符号,例如字段名称,方法签名和插入的字符串。符号存储器使用过多可能表明字符串被过分地插入。
- 内部:存储其他区域不适合的其他内部数据。
4.JVM内存图
5.堆
Java虚拟机有一个堆,在所有Java虚拟机线程之间共享。堆是运行时数据区域,从中为所有类实例和数组分配内存。
堆是在虚拟机启动时创建的。堆内对象的存储由自动存储管理系统(垃圾收集器)回收;J堆可以是固定大小的,也可以根据计算需要进行扩展,如果不需要更大的堆,则可以收缩堆。堆的内存不需要是连续的。
程序员或用户可以控制Java虚拟机堆的初始大小,以及堆可以被动态扩展或收缩,即控制最大和最小堆大小。
以下异常情况与堆关联:
如果计算需要的堆内存比自动存储管理系统提供的多,Java虚拟机将抛出OutOfMemory错误。
6.虚拟机栈
每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表
、操作数栈
、动态链接
、方法出口
等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。