Java堆术语:年轻,古老和永久的世代?

kno*_*orv 304 java garbage-collection jvm heap-memory

我试图理解Java堆术语中年轻,一代永久世代的概念,更具体地说是三代之间的相互作用.

我的问题是:

  • 什么是年轻一代?
  • 什么是老一代?
  • 什么是永久世代?
  • 三代人如何相互作用/相互联系?

Jos*_*non 291

这似乎是一种常见的误解.在Oracle的JVM中,永久代不是堆的一部分.它是类定义和相关数据的独立空间.在Java 6及更早版本中,实习字符串也存储在永久代中.在Java 7中,实习字符串存储在主对象堆中.

这是关于永久性一代好帖子.

我喜欢Oracle JConsole指南中为每个空间提供的描述:

对于HotSpot Java VM,串行垃圾收集的内存池如下.

  • Eden Space(堆):最初为大多数对象分配内存的池.
  • 幸存者空间(堆):包含在伊甸园空间的垃圾收集中幸存下来的对象的池.
  • Tenured Generation(堆):包含在幸存者空间中存在一段时间的对象的池.
  • 永久生成(非堆):包含虚拟机本身的所有反射数据的池,例如类和方法对象.对于使用类数据共享的Java VM,这一代分为只读和读写区域.
  • 代码缓存(非堆):HotSpot Java VM还包括代码缓存,其中包含用于编译和存储本机代码的内存.

Java使用分代垃圾收集.这意味着如果你有一个对象foo(它是某个类的一个实例),它存活的垃圾收集事件就越多(如果仍有对它的引用),它就会被进一步提升.它始于年轻一代(它本身被划分为多个空间 - 伊甸园和幸存者),并且如果它存活足够长时间,它最终会在终身一代中结束.

  • 约书亚 - "老"是"终身"的代名词,是"幸存者"的"新"代名词吗? (9认同)
  • 我相信,从Java 7开始,字符串不再在永久代中实现. (2认同)
  • perm gen 仅适用于 Java 8 之前的版本。 (2认同)
  • 如果您仍在等待答案,是的,您是对的@joadha。查看此链接:https://codeahoy.com/2017/08/06/basics-of-java-garbage-collection/ (2认同)

Pre*_*raj 180

Heap分为年轻代和老代,如下:

年轻一代:这是短期居住的地方,分为两个空间:

  • Eden Space:使用在此空间分配的新关键字内存创建的对象.
  • 幸存者空间:这是包含从伊甸园空间收集垃圾后幸存下来的对象的池.

老一代:这个池基本上包含终身和虚拟(保留)空间,并将持有从Young Generation收集垃圾后幸存的那些对象.

  • 终身空间:此内存池包含在多个垃圾收集装置后幸存的对象,这些对象在从Survivor空间收集垃圾后幸存.

永久生成:这个名称的内存池也包含永久类元数据和描述符信息,因此PermGen空间始终保留给类和那些与类绑定的空间,例如静态成员.

Java8更新: PermGen被替换为非常相似的Metaspace.
主要区别在于Metaspace动态地重新调整大小,即它可以在运行时扩展.
Java Metaspace空间:无界(默认)

代码缓存(虚拟或保留):如果您使用的是HotSpot Java VM,则包括代码缓存区域,其中包含将用于编译和存储本机代码的内存.

在此输入图像描述

礼貌


Rav*_*abu 44

什么是年轻一代?

年轻一代是所有新对象分配和老化.当年轻一代填满时,这会导致轻微的垃圾收集.很快就会收集到充满死亡物体的年轻一代.一些幸存的物体会老化并最终移动到老一代.

什么是老一代?

老一代用来存储长期生存的对象.通常,为年轻代对象设置阈值,并且当满足该年龄时,对象被移动到旧代.最终需要收集老一代.此事件称为主要垃圾回收

什么是永久世代?

常驻生成包含由JVM来描述应用程序使用的类和方法所需的元数据.JVM在运行时根据应用程序使用的类填充永久代.

自Java 8发布以来,PermGen已被Metaspace取代.

PermSize和MaxPermSize参数现在将被忽略

三代人如何相互作用/相互联系?

在此输入图像描述

图像源和oracle technetwork教程文章:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

上面文章中的" 一般垃圾收集过程 "解释了它们与许多图表之间的相互作用.

看一下摘要图:

在此输入图像描述


小智 15

Java虚拟机分为三代:年轻一代,老一代和永久一代.大多数对象最初都是在年轻一代中分配的.旧一代包含在一些年轻代集合中存活的对象,以及可能直接在旧代中分配的一些大对象.永久生成保存JVM方便垃圾收集器管理的对象,例如描述类和方法的对象,以及类和方法本身.