本文摘自《Java性能优化权威指南》第5章“Java应用性能分析”,这一章介绍了Java应用性能分析的基本概念。本文节选的是正文里穿插的一个小TIP。


为了理解内存分析结果视图中代的这一列的含义,你必须了解Java虚拟机的垃圾收集过程。每次垃圾收集器运行时,一个对象或者是存活下来,继续占用堆内存,或者是被移除,其内存也被释放。如果存活下来,则它的年龄会加1。换句话说,可以把对象的年龄简单理解为它经历过的垃圾收集次数。

代的个数是不同的对象年龄数。例如,应用程序第一次启动时为几个对象分配了空间。应用程序执行过程中,又分配了另外一组对象。最后有一些对象被分配,并只经历了一次垃圾收集。如果整个执行过程中,垃圾收集器执行了80次,第一组的所有对象的年龄为80,第二组中所有对象的年龄为40,第三组中所有对象的年龄为1,那么,代的个数的值就为3,因为堆上所有对象只有三个不同的年龄,分别是:80、40以及1。

在大多数Java应用程序中,代的个数最终会稳定下来。这是因为应用程序的持久对象已经分配完成。由于生命周期较短的对象很快会被垃圾收集所以不会对代的个数产生影响。

如果应用程序中代的个数随着程序运行持续增长,那很可能是发生了内存泄漏。换句话说,应用程序随着时间推进不断地分配对象,每一个对象都有不同的年龄,因为它们所经历的垃圾收集周期数不一样。如果对象被正确回收,不同对象年龄的数目不会持续增长。

《Java性能优化权威指南》的边边角(4)——封面吉祥物Duke