本篇主要介绍一下,JVM运行时数据区的内容。
首先大概介绍一下下图所示的内容。JVM运行时数据区主要分为了两大部分的内容:线程共有的方法区(Method Area)和堆(Heap)、线程私有的虚拟机栈(VM Stack),本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。在数据区下面的执行引擎中又包含了:即时编译器(JITCompiler)和垃圾收集器(GC)。GC主要用于回收线程共享的区域(方法区和堆),对于私有的内存区域则方法执行完毕后系统自动释放。(在实际的程序当中,线程私有的内存区域会有很多份)
对于整个运行时数据区而言,外部交互的模块有执行引擎、本地库接口和类加载器。
JVM运行时数据区(图片来源)
下面分别介绍一下,各个内存区域的详细信息。
1、程序计数器(Program Counter Register [私有]):是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。① (此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError的区域)
2、JVM栈(Java Virtual Machine Stacks [私有]):每个方法在执行的时候都会同时创建一个栈帧。JVM栈中包含了:局部变量表、操作栈、动态链接、方法出口等信息。
3、本地方法栈(Native Method Stacks [私有]):其内存结构类似于JVM栈,不过使用到的是本地库接口。
4、堆(Heap [共享]):堆区域是JVM内存管理里面最大的一块,几乎所有通过new出来的对象都放在此区域。在GC的过程中,绝大部分的内存回收发生在此区域。
5、方法区(Method Area [共享]):方法区主要用于存储被JVM加载的类信息、常量、静态变量、即时编译后的代码等。
6、运行时常量池(Runtime Constant Pool [方法区组成部分]):用于存放编译器生成的各种字面量和符号引用。