java内存池是如何划分的?

java内存池是如何划分的?,java,memory,pool,Java,Memory,Pool,我目前正在用jconsole监视一个Java应用程序。“内存”选项卡允许您在以下选项中进行选择: 堆内存使用率 非堆内存使用 内存池“伊甸园空间” 内存池“幸存者空间” 内存池“终身发电机” 内存池“代码缓存” 内存池“Perm Gen” 他们之间有什么区别 堆内存 堆内存是Java VM为所有类实例和数组分配内存的运行时数据区域。堆的大小可以是固定的,也可以是可变的。垃圾收集器是一个自动内存管理系统,用于回收对象的堆内存 伊甸园空间:最初为大多数对象分配内存的池 幸存者空间:包含从伊甸园空

我目前正在用jconsole监视一个Java应用程序。“内存”选项卡允许您在以下选项中进行选择:

堆内存使用率
非堆内存使用
内存池“伊甸园空间”
内存池“幸存者空间”
内存池“终身发电机”
内存池“代码缓存”
内存池“Perm Gen”
他们之间有什么区别

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

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

  • 幸存者空间:包含从伊甸园空间垃圾收集中幸存下来的对象的池

  • 终身世代旧世代:包含幸存者空间中已存在一段时间的对象的池

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

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

  • 代码缓存:HotSpot Java VM还包括一个代码缓存,其中包含用于编译和存储本机代码的内存


对于Java8,非堆区域不再包含PermGen,而是元空间,这是Java8中的一个主要变化,它应该可以消除java的内存不足错误,因为元空间大小可以根据jvm对类数据所需的空间而增加。

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

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

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

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


Java堆内存是操作系统分配给JVM的内存的一部分

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

您可以在下面的问题中找到有关伊甸园空间、幸存者空间、终身空间和永久世代的更多详细信息:

自Java8发布以来,PermGen已被Metaspace取代

关于您的疑问:

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

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

    堆分为年轻和老两代,如下所示:

    年轻一代:这是一个物体短暂居住的地方,它被分成两个空间:

    • 伊甸园空间:当使用在该空间上分配的新关键字内存创建对象时
    • 幸存者空间(S0和S1):这是一个池,其中包含从Eden进行小规模java垃圾收集后幸存下来的对象 空间
    旧一代:此池基本上包含永久空间和虚拟(保留)空间,并将保存年轻一代垃圾收集后幸存下来的对象

    • 终身空间:此内存池包含在多次垃圾收集后幸存的对象,表示一个幸存的对象 从幸存者空间收集垃圾后