代码之家  ›  专栏  ›  技术社区  ›  Dani Cricco

Java内存池是如何划分的?

  •  202
  • Dani Cricco  · 技术社区  · 15 年前

    我现在用J控制台监视Java应用程序。“内存”选项卡允许您在以下选项之间进行选择:

    Heap Memory Usage
    Non-Heap Memory Usage
    Memory Pool “Eden Space”
    Memory Pool “Survivor Space”
    Memory Pool “Tenured Gen”
    Memory Pool “Code Cache”
    Memory Pool “Perm Gen”
    

    他们之间有什么区别?

    4 回复  |  直到 6 年前
        1
  •  303
  •   Gray droiddeveloper    6 年前

    堆内存

    堆内存是运行时数据区域,Java VM从该区域开始为所有类实例和数组分配内存。堆的大小可以是固定的,也可以是可变的。垃圾收集器是一个自动内存管理系统,它为对象回收堆内存。

    • 伊甸空间 :最初为大多数对象分配内存的池。

    • 幸存区 :包含在伊甸园空间的垃圾收集中幸存的对象的池。

    • 年老代 老将军 :包含在幸存者空间中存在一段时间的对象的池。

    非堆内存

    非堆内存包括一个方法区域,在所有线程和内存之间共享,用于Java VM的内部处理或优化。它存储每个类结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码。方法区域在逻辑上是堆的一部分,但是,取决于实现,Java VM可能不会垃圾收集或压缩它。与堆内存一样,方法区域的大小可以是固定的,也可以是可变的。方法区域的内存不需要是连续的。

    • 永久性一代 :包含虚拟机本身的所有反射数据(如类和方法对象)的池。通过使用类数据共享的Java VM,这一代被分为只读和读写区域。

    • 代码缓存 热点JAVA VM还包括代码缓存,包含用于编译和存储本机代码的内存。

    Here's some documentation on how to use Jconsole .

        2
  •  56
  •   Pythoner    8 年前

    新关键字在Java堆上分配内存。堆是内存的主要池,可供整个应用程序访问。如果没有足够的内存分配给该对象,则JVM将尝试通过垃圾收集从堆中回收一些内存。如果仍然无法获得足够的内存,则抛出OutOfMemoryError,然后退出JVM。

    堆被分成几个不同的部分,称为代。随着对象在更多垃圾收集中存活,它们被提升到不同的代。老一代并不像以前那样经常被垃圾收集。因为已经证明这些对象的寿命更长,所以它们不太可能被垃圾收集。

    当对象第一次被构造时,它们被分配到伊甸园空间中。如果他们在垃圾收集中幸存下来,他们将被提升为幸存者空间,如果他们在那里活得足够长,他们将被分配给终身一代。这一代人的垃圾收集频率要低得多。

    还有第四代,称为永久一代,或永久一代。驻留在这里的对象不符合被垃圾收集的条件,并且通常包含运行JVM所必需的不可变状态,例如类定义和字符串常量池。请注意,PrimGEN空间计划从Java 8中移除,并将被称为Meta SpACE的新空间替换,该新空间将保存在本机内存中。 参考文献 http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

    enter image description here enter image description here

        3
  •  32
  •   user2767149    10 年前

    使用Java8,非堆区域不再包含PyMGEN但Meta SPACE,这是Java8中的一个主要变化,应该消除Java的内存不足,因为Meta空间大小可以根据JVM对类数据所需的空间而增加。

        4
  •  16
  •   Community Michael Schmitz    7 年前

    主内存 是操作系统分配给JVM的内存的一部分。

    对象位于称为堆的区域中。堆是在JVM启动时创建的,并且在应用程序运行时可能会增大或减小大小。当堆满时,将收集垃圾。

    enter image description here

    你可以找到更多关于 伊甸园空间、幸存者空间、终身空间和永久世代 在下面的问题中:

    Young , Tenured and Perm generation

    自从Java 8发布以来,PyMGEN已经被Meta SPACE取代了。

    关于您的查询:

    1. 伊甸园空间、幸存者空间、终身空间是堆内存的一部分
    2. 元空间和代码缓存是非堆内存的一部分。

    Codecache: Java虚拟机(JVM)生成本地代码并将其存储在称为CODECACHE的内存区域中。JVM出于多种原因生成本机代码,包括动态生成的解释器循环、Java本机接口(JNI)存根,以及JavaTimes(JIT)编译器将其编译成本机代码的Java方法。到目前为止,JIT是codecache的最大用户。