本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:Java堆术语:年轻一代,老一代和永久一代是什么?
我试图了解Java堆术语中的年轻,老年和永久一代的概念是什么,更具体地说是三代之间的交互。
我的问题是:
1,什么是年轻一代?
2,什么是老一辈?
3,什么是永久一代?
4,这三代人之间是如何相互作用/相互联系的?
回答1:
这似乎是一种常见的误解。在Oracle的JVM中,永久生成不是堆的一部分。它是用于类定义和相关数据的单独空间。在Java 6和更早版本中,临时字符串也存储在永久代中。在Java 7中,临时字符串存储在主对象堆中。
这是关于永久一代的很好的帖子。
我喜欢Oracle关于JConsole的指南中对每个堆空间的描述
对于HotSpot Java VM,以下是用于串行垃圾回收的内存池。
Eden区(堆):最初为大多数对象分配内存的池。 Survivor区(堆):包含在Eden空间的垃圾回收中幸存的对象的池。 永生区(堆):包含幸存者空间中已存在一段时间的对象的池。 永生区(非堆):包含虚拟机本身的所有反射数据(例如类和方法对象)的池。对于使用类数据共享的Java VM,这一代被分为只读和读写区域。 代码缓存(非堆):HotSpot Java VM还包括代码缓存,其中包含用于编译和存储本机代码的内存。
Java使用分代垃圾回收。这意味着,如果您有一个对象foo(它是某个类的实例),则该对象幸存的垃圾收集事件越多(如果仍然有对其的引用),则它年龄越大。它始于年轻代(本身被划分为多个空间-e区和s区),如果生存了足够长的时间,最终将在永生代中结束。