年轻,终身和烫发一代
我与堆,年轻,终身和烫发一代混淆。
谁能解释一下吗?
Java垃圾收集器被称为Generational Garbage Collector 。 应用程序中的对象根据创build的位置以及使用方式而存在不同的时间长度。 这里的关键洞察是,对于短寿命和长寿命的对象使用不同的垃圾收集策略,可以针对每种情况对GC进行专门优化。
松散地说,随着对象“生存”, 青年一代的垃圾收集工作重新进行,他们被迁移到了“ 老一代” 。 Permanent Generation是一种特殊情况,它包含JVM所需的对象,这些对象不一定代表程序中的对象,例如表示类和方法的对象。
由于年轻一代通常会包含大量的垃圾,因此对于一次摆脱大量未使用的对象进行了优化。 因为它包含更长寿的对象,所以Tenured Generation对于快速垃圾回收进行了优化,而不会浪费大量的内存。
随着垃圾收集技术的改进,细节变得相当复杂,并且取决于您的JVM以及它的configuration方式。 如果您需要确切知道发生了什么,则应该阅读所使用的特定JVM的文档 。
这就是说有一个简单的历史安排,这在概念层面上仍然是有用的。 从历史上看, 年轻一代将是一个抄袭collections家 ,“ 老一代”是一个标记和collections家 。 一个副本收集器支付基本上没有CPU成本来摆脱垃圾,大部分的成本是在维持活的物体,这个效率的价格是更重的内存使用。 标记和清除收集器为活动和未使用的对象支付一些CPU成本,但更有效地利用内存。
Java堆内存是由操作系统分配给JVM的内存的一部分。 每当我们创build对象时,他们都是在java中创build的。
Java堆空间被分成三个区域或一代,为了垃圾收集的目的而被称为“ 年轻一代”,“旧时代”或“老生代”和“永久代” 。 永久代是垃圾收集期间在gc中的热点JVM收集
年轻一代是所有新物体被分配和老化的地方。 当年轻一代填满时,这会导致轻微的垃圾收集。 一个充满死物的年轻一代很快就被收集起来。 一些幸存的物体老化,最终转移到老一代。
老一代用来存放长期存活的物体。 典型地,为年轻一代的对象设置一个阈值,当这个年龄被满足时,该对象被移动到老一代。 最终老一代需要收集。 这个事件被称为主要的垃圾收集。
永久代包含JVM所需的元数据,用于描述应用程序中使用的类和方法。 永久代由JVM在运行时根据应用程序使用的类来填充。
自Java 8发布以来, PermGen已经被Metaspace所取代。 PermSize&MaxPermSize参数现在将被忽略。 看看这个由皮埃尔 – 乌格斯 ·夏博诺(Margaret Charbonneau)撰写的关于Metaspace的dzone文章 。
图片来源: http : //www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
有关更多详情,请参阅相同的文章。
堆中的所有对象都会被引用。 当他们不多时,垃圾收集器(GC)将回收他们的内存。
PermGen,Young和Tenured是物体的不同分类(或堆中的空间)。
PermGen:这些对象将永远在那里,他们不是垃圾收集。 类对象在那里,internedstring等,我不知道是否有一个GC在那里(当系统UNloads类…但这不是一个正常的事情)
年轻:当一个对象被创build时,它就在这里。
终结:当一个对象在N GC遍历(幸存= GC遍历,但是这个对象被引用,因此它不能被回收)存活的时候进入这个分类/类别。
根据使用的GC和一些参数,GC通常或多或less地通过。
然后垃圾收集可以有不同的方法来堆在堆中的对象。 对象的这种分类有助于做到这一点。
这里有另外一篇关于如何调整/调整GC参数的很好(虽然很长)的文章,这可能会帮助你更好地理解:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/
如果您有GC问题,需要了解如何阅读GC日志,或者需要了解当前的GC收集器的工作方式,则可以进行非常有用的阅读。
如果要连接正在运行的系统的远程监视,以查看实时内存使用情况并运行GC,请检查此工具: