Java虚拟机(JVM)运行时数据区

JVM规范定义了在执行程序期间所需的某些运行时数据区域。其中一些是在JVM启动时创建的。其他是线程局部的,只有在创建线程时才会创建(并在线程被销毁时销毁)。它们分别如下 -

PC(程序计数器)寄存器" class="reference-link">PC(程序计数器)寄存器

它是每个线程局部,包含线程当前正在执行的JVM指令的地址。

堆" class="reference-link">

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

堆" class="reference-link">

它在所有线程之间共享,并包含在运行时创建的对象,类的元数据,数组等。它是在JVM启动时创建的,并在JVM关闭时销毁。可以使用某些标志来控制JVM从操作系统中请求的堆量(稍后将详细介绍)。必须注意不要求太少或太多的内存,因为它对性能有显著的影响。此外,GC管理此空间并不断移除死对象以释放空间。

方法区

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

运行时常量池

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

本机方法栈

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

垃圾收集

JVM管理Java中对象的整个生命周期。创建对象后,开发人员不再需要担心它。如果对象变为死亡(也就是说,它不再引用它),它将使用众多算法之一从GC中弹出 - 串行GC,CMS,G1等。

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

由于GC,Java中的内存泄漏非常罕见,但它们可能会发生。在后面的章节中看到如何在Java中创建内存泄漏。


以下是纠正/补充内容:

第一个堆,应该是栈或堆栈?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?  提交时间:2019-09-01

上一篇:Java虚拟机(JVM)类加载器

下一篇:Java虚拟机(JVM)JIT编译器

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程