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

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中创建内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧浩海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值