JVM(Java Virtual Machine)

1.JVM介绍

  • Java虚拟机是Java平台的基石。
  • Java虚拟机不能解释Java编程语言,它只知道一种特定的二进制格式,即类文件格式。类文件包含Java虚拟机指令(或者说字节码)和符号表,以及其他辅助信息。

2.JVM内存划分

  • JVM内存分为两大类:堆内存和非堆内存。
  • 堆内存:它存储了类实例和数组,直到被回收
  • 非堆内存:code cache,Compressed class space,Metaspace等

使用NMT报告的JVM内存使用情况:

JVM - 图1

如您所见,非堆内存占JVM内存使用的绝大部分,而堆内存仅占总数的六分之一

3.本机内存区域

  • Compressed class space(压缩的类空间):用于存储有关已加载类的信息。可以理解为一个已加载的类数的函数,受-XX:MaxMetaspaceSize约束。默认情况下是元空间(Metaspace)的一部分
  • Thread(线程):JVM中的线程使用的内存,在虚拟机栈中分配。
  • code cache(代码缓存):JIT用于存储其输出的内存。一个已加载的类数的函数。受ReservedCodeCacheSize约束。例如可以通过将JIT调整禁用分层编译来减少。
  • GC:存储GC使用的数据。取决于使用哪个垃圾收集器。
  • Symbol:存储符号,例如字段名称,方法签名和插入的字符串。符号存储器使用过多可能表明字符串被过分地插入。
  • 内部:存储其他区域不适合的其他内部数据。

4.JVM内存图

JVM - 图2

5.堆

Java虚拟机有一个堆,在所有Java虚拟机线程之间共享。堆是运行时数据区域,从中为所有类实例和数组分配内存。

堆是在虚拟机启动时创建的。堆内对象的存储由自动存储管理系统(垃圾收集器)回收;J堆可以是固定大小的,也可以根据计算需要进行扩展,如果不需要更大的堆,则可以收缩堆。堆的内存不需要是连续的。

程序员或用户可以控制Java虚拟机堆的初始大小,以及堆可以被动态扩展或收缩,即控制最大和最小堆大小。

以下异常情况与堆关联:

如果计算需要的堆内存比自动存储管理系统提供的多,Java虚拟机将抛出OutOfMemory错误。

6.虚拟机栈

每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表操作数栈动态链接方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。