📜  Java虚拟机-运行时数据区

📅  最后修改于: 2020-11-13 05:35:06             🧑  作者: Mango


JVM规范定义了程序执行期间所需的某些运行时数据区域。其中一些是在JVM启动时创建的。其他线程是线程本地的,仅在创建线程时创建(在销毁线程时销毁)。这些在下面列出-

PC(程序计数器)寄存器

它在每个线程本地,并且包含该线程当前正在执行的JVM指令的地址。

叠放

它是每个线程本地的,并在方法调用期间存储参数,本地变量和返回地址。如果线程需要的堆栈空间超出允许的范围,则会发生StackOverflow错误。如果堆栈是可动态扩展的,则它仍然会抛出OutOfMemoryError。

它在所有线程之间共享,并且包含在运行时创建的对象,类的元数据,数组等。它在JVM启动时创建,并在JVM关闭时销毁。您可以使用某些标志来控制来自操作系统的JVM需求的堆数量(稍后会对此进行更多介绍)。必须注意不要占用过多或过多的内存,因为它具有重要的性能影响。此外,GC管理此空间,并连续清除不活动的对象以释放空间。

方法范围

该运行时区域是所有线程共有的,并且是在JVM启动时创建的。它存储每个类的结构,例如常量池(稍后会详细介绍),构造函数和方法的代码,方法数据等。JLS不指定是否需要对该区域进行垃圾回收,因此,不执行此操作。 JVM可能会选择忽略GC。此外,这可能会或可能不会根据应用程序的需要扩展。 JLS对此没有任何要求。

运行时常量池

JVM维护每个类/每个类型的数据结构,该结构在链接已加载的类时充当符号表(它的许多角色之一)。

本机方法堆栈

当线程调用本机方法时,它将进入一个新世界,在该世界中Java虚拟机的结构和安全性限制不再妨碍其自由。本机方法可能会访问虚拟机的运行时数据区域(取决于本机方法接口),但也可以执行其所需的任何其他操作。

垃圾收集

JVM管理Java中对象的整个生命周期。创建对象后,开发人员无需再担心它。万一对象变成死对象(也就是说,不再有对其的引用),则GC使用许多算法之一(串行GC,CMS,G1等)将其从堆中弹出。

在GC过程中,对象将在内存中移动。因此,在过程进行中,这些对象不可用。在整个过程中,必须停止整个应用程序。这种停顿称为“世界停止”停顿,并且是巨大的开销。 GC算法的主要目的是减少时间。我们将在以下各章中对此进行详细讨论。

由于有了GC,内存泄漏在Java中非常少见,但可能会发生。在后面的章节中,我们将介绍如何在Java中创建内存泄漏。