我试图理解Java堆术语中的年轻、老和永久世代的概念,更具体地说,这三代人之间的相互作用.
我的问题是:
- 什么是年轻一代?
- 什么是老一代?
- 什么是永久的一代?
- 这三代人之间是如何互动/联系的呢?
我试图理解Java堆术语中的年轻、老和永久世代的概念,更具体地说,这三代人之间的相互作用.
我的问题是:
这似乎是一个常见的误解.在Oracle的JVM中,永久生成不是堆的一部分.它是一个单独的空间,用于存储类定义和相关数据.在Java6和更早版本中,插入的字符串也存储在永久生成中.在Java7中,插入的字符串存储在主对象堆中.
这是一篇关于permanent generation的好帖子.
我喜欢甲骨文guide on JConsole中每个空间的描述:
对于HotSpot Java VM,内存
- Eden Space(堆):最初分配内存的池
- 幸存空间(堆):包含幸存对象的池 伊甸园的垃圾收集 太空.
- 永久生成(堆):包含已存在对象的池
- 永久生成(非堆):包含所有反射
- 代码缓存(非堆):HotSpot Java VM还包括一个代码缓存,
Java使用分代垃圾收集.这意味着如果您有一个对象foo(它是某个类的实例),它存活的垃圾收集事件越多(如果仍然有对它的引用),它就会得到进一步提升.它开始于年轻一代(它本身被分成多个空间-伊甸园和幸存者),如果它存活足够长的时间,最终将在终生一代结束.