JVM规范定义了在执行程序期间所需的某些运行时数据区域。其中一些是在JVM启动时创建的。其他是线程局部的,只有在创建线程时才会创建(并在线程被销毁时销毁)。它们分别如下 -
它是每个线程局部,包含线程当前正在执行的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中创建内存泄漏。
第一个堆,应该是栈或堆栈?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字?为什么要五十个字? 提交时间:2019-09-01