JVM 运行时数据区
-
运行时数据区
JVM规范定义了程序执行期间所需的某些运行时数据区域。其中一些是在JVM启动时创建的。其他线程是线程本地的,仅在创建线程时创建(在销毁线程时销毁)。这些在下面列出- -
PC(程序计数器)寄存器
它在每个线程本地,并且包含该线程当前正在执行的JVM指令的地址。 -
栈
它是每个线程局部的,并在方法调用期间存储参数,局部变量和返回地址。如果线程需要的堆栈空间超出允许的范围,则会发生StackOverflow(栈溢出)错误。如果堆栈是动态可扩展的,它仍然可以抛出OutOfMemoryError(内存越界)。 -
堆
它在所有线程之间共享,并包含在运行时创建的对象,类的元数据,数组等。它在JVM启动时创建,并在JVM关闭时销毁。您可以使用某些标志来控制来自操作系统的JVM需求的堆数量(稍后会对此进行更多介绍)。必须注意不要要求过多或过多的内存,因为它具有重要的性能影响。此外,GC(垃圾回收)管理此空间,并连续清除不活动的对象以释放空间。 -
方法区域(代码段)
该运行时区域是所有线程共有的,并且是在JVM启动时创建的。它存储每个类的结构,例如常量池(稍后会详细介绍),构造函数和方法的代码,方法数据等。JLS不指定是否需要对该区域进行垃圾收集,因此,不执行此操作。 JVM可能会选择忽略GC。此外,这可能会或可能不会根据应用程序的需要扩展。JLS对此没有任何要求。 -
方法区域(代码段)
该运行时区域是所有线程共有的,并且是在JVM启动时创建的。它存储每个类的结构,例如常量池(稍后会详细介绍),构造函数和方法的代码,方法数据等。JLS不指定是否需要对该区域进行垃圾收集,因此,不执行此操作。 JVM可能会选择忽略GC。此外,这可能会或可能不会根据应用程序的需要扩展。JLS对此没有任何要求。 -
运行时常量池
JVM维护每个类/每个类型的数据结构,该结构在链接已加载的类时充当符号表(它的许多角色之一)。 -
本机方法堆栈
当线程调用本机方法时,它将进入一个新的世界,在该世界中Java虚拟机的结构和安全性限制不再影响到它。本机方法可能会访问虚拟机的运行时数据区域(取决于本机方法接口),但也可以执行其所需的任何其他操作。 -
垃圾回收
JVM管理Java中对象的整个生命周期。创建对象后,开发人员无需再担心它。万一对象变成死对象(也就是说,不再有对其的引用),则GC使用许多算法之一(串行GC,CMS,G1等)将其从栈中弹出。 在GC(垃圾回收)过程中,对象将在内存中移动。因此,在过程进行过程中,这些对象不可用。在整个过程中,必须停止整个应用程序。这种停顿称为“时光凝滞”停顿,并且是巨大的开销。GC算法的主要目的是减少这种时间。我们将在以下各章中对此进行详细讨论。由于使用了GC,内存泄漏在Java中非常少见,但可能会发生。在后面的章节中,我们将介绍如何在Java中创建内存泄漏。