我试图理解Java堆术语中的年轻、老和永久代的概念,更具体地说是三代之间的交互
我的问题是:
- 年轻一代是什么
- 什么是老一代
- 什么是永久的一代
- 这三代人是如何相互影响/联系的
这似乎是一个常见的误解。在Oracle的JVM中,永久生成不是堆的一部分。它是一个用于类定义和相关数据的单独空间。在Java6和更早版本中,插入的字符串也存储在永久生成中。在Java7中,插入的字符串存储在主对象堆中
这是一篇关于永久发电
我喜欢Oracle的JConsole指南
对于热点Java虚拟机,内存
用于串行垃圾收集的池
有以下几点
- Eden空间(堆):最初分配内存的池
对于大多数对象- 幸存者空间(堆):包含幸存对象的池
伊甸园的垃圾收集
空间- 永久生成(堆):包含已存在对象的池
在幸存者空间里呆了一段时间- 永久生成(非堆):包含所有反射
虚拟机本身的数据,
例如类和方法对象。具有
使用类数据共享的Java虚拟机,
这一代人分为
只读和读写区域- 代码缓存(非堆):HotSpot Java VM还包括一个代码缓存,
包含用于存储的内存
本机数据的编译与存储
代码
Java使用分代垃圾收集。这意味着,如果您有一个对象foo(它是某个类的实例),那么它生存的垃圾收集事件越多(如果仍然有对它的引用),它升级的程度就越高。它从年轻一代开始(年轻一代本身被划分为多个空间——伊甸园和幸存者),如果它存活足够长的时间,最终将在终身一代结束