Java堆术语:年轻一代、老年一代和永久一代?

Java堆术语:年轻一代、老年一代和永久一代?,java,garbage-collection,jvm,heap-memory,Java,Garbage Collection,Jvm,Heap Memory,我试图理解Java堆术语中年轻、老和永久代的概念是什么,更具体地说是三代之间的交互 我的问题是: 年轻一代是什么 什么是老一代 什么是永久的一代 这三代人是如何相互影响/联系的 Java虚拟机分为三代:年轻一代、老一代和永久一代。大多数对象最初是在年轻一代中分配的。旧一代包含在一些年轻一代集合中幸存下来的对象,以及一些可以直接在旧一代中分配的大型对象。永久生成包含JVM认为便于垃圾收集器管理的对象,例如描述类和方法的对象,以及类和方法本身。这似乎是一个常见的误解。在Oracle的JVM中,永久

我试图理解Java堆术语中年轻、老和永久代的概念是什么,更具体地说是三代之间的交互

我的问题是:

  • 年轻一代是什么
  • 什么是老一代
  • 什么是永久的一代
  • 这三代人是如何相互影响/联系的

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

这似乎是一个常见的误解。在Oracle的JVM中,永久生成不是堆的一部分。它是一个用于类定义和相关数据的单独空间。在Java6和更早版本中,插入的字符串也存储在永久生成中。在Java7中,插入的字符串存储在主对象堆中

这里有一个关于你的好帖子

我喜欢Oracle中每个空间的描述:

对于热点Java虚拟机,内存 用于串行垃圾收集的池 有以下几点

  • Eden空间(堆):最初分配内存的池 对于大多数对象
  • 幸存者空间(堆):包含幸存对象的池 伊甸园的垃圾收集 空间
  • 永久生成(堆):包含已存在对象的池 在幸存者空间里呆了一段时间
  • 永久生成(非堆):包含所有反射 虚拟机本身的数据, 例如类和方法对象。具有 使用类数据共享的Java虚拟机, 这一代人分为 只读和读写区域
  • 代码缓存(非堆):HotSpot Java VM还包括一个代码缓存, 包含用于存储的内存 本机数据的编译与存储 代码
Java使用分代垃圾收集。这意味着,如果您有一个对象foo(它是某个类的实例),那么它生存的垃圾收集事件越多(如果仍然有对它的引用),它升级的程度就越高。它从年轻一代开始(年轻一代本身被划分为多个空间——伊甸园和幸存者),如果它存活足够长的时间,最终将在终身一代结束

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

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

  • 伊甸园空间:使用新关键字创建对象时分配的内存 在这个空间上
  • 幸存者空间:这是一个池,其中包含有 从Eden空间收集java垃圾后幸存下来
老一代:此池基本上包含终身和虚拟资源 (保留)空间并将容纳幸存下来的物体 经过年轻一代的垃圾收集

  • 永久空间:此内存池包含在多次垃圾收集后幸存的对象,表示从幸存空间进行垃圾收集后幸存的对象
永久性生成:这个内存池(如名称所示)还包含永久性类元数据和描述符信息,因此永久性生成空间始终保留给类和绑定到类的类(例如静态成员)

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

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


SunHotSpot JVM中的内存分为三代:年轻一代、老一代和永久一代

  • 年轻一代:新创建的对象分配给年轻一代
  • 旧一代:如果新对象请求更大的堆空间,它将直接分配到旧一代中。同时,在几个GC周期中幸存下来的对象将升级到旧一代,即旧一代中的长寿命对象
  • 永久生成:永久生成保存JVM认为便于垃圾收集器管理的对象,例如描述类和方法的对象,以及类和方法本身
仅供参考:永久gen不被视为Java堆的一部分

这三代人之间如何互动/联系? 对象(大对象除外)首先分配给年轻一代。如果一个对象在x个垃圾收集周期后仍处于活动状态,它将被提升到旧的/终身的gen。因此,我们可以说年轻的gen包含寿命短的对象,而旧的gen包含寿命长的对象。永久世代不与其他两代人互动

年轻一代是什么

年轻一代是分配和老化所有新对象的地方。当年轻一代填满时,这会导致较小的垃圾收集。年轻一代的尸体很快就被收集起来了。一些幸存下来的物体会老化,最终会转移到老一代

什么是旧的