我不完全确定这一点,但我认为,控制所有内存池的垃圾回收器(至少一个用于老一代)是用于主要gc的一个。例如:我有JVM与这些2个收集器运行:
- PS MarkSweep
- MemoryPoolNames:PS伊甸空间,PS幸存者空间,PS旧根,PS彼尔姆根
- CollectionCount:68
- PS扫气
- MemoryPoolNames:PS伊甸园空间,PS生存空间
- CollectionCount:2690
考虑到这一点,我会说,PS扫气用于较小的GC和PS MarkSweep重大GC。
UPDATE(基于@ajeanson评论,感谢您的反馈BTW):
实际上,我摆在那里的例子来自于我所用的JVM的MXBean的公开的信息中取得。如您所述,这些是GC算法,GC的MXBean所使用的名称是基于GC正在使用的算法。我一直在寻找更多关于这方面的信息;本文http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html中,读取以下:
虽然Java HotSpot VM定义了两个 一代:年轻一代 (有时称为“托儿所”)和 老一代。年轻的 一代包括一个“伊甸园空间” 和两个“幸存者空间”。 VM 最初将所有对象分配给Eden空间,并且大多数对象在那里死亡 。当它执行次要GC时,VM将任何剩余的对象 从Eden空间移动到 幸存空间之一。虚拟机移动对象 ,该对象在活着的 空间中足够长的时间移动到 老一代的“终身”空间。当终身 代填满时,有一个完整的GC,通常要慢得多,因为它涉及所有活动对象。 永久代持有虚拟机 本身的所有反射数据,如类和方法 对象。
考虑看看上的MXBean的collectionCount财产,在我的“PS MarkSweep”收集器的情况下(在一个管理的老一代池),集数,似乎当我得到一个完整的GC只增加在详细输出中。我可能是错的,也许在某些情况下,这个收集器也会执行较小的GC,但我需要运行更多的测试才能完全确定这一点。 请让我知道是否有人发现了别的东西,或者您对这个问题有更多具体的信息,因为我对它很感兴趣。
您可能会发现gc之前/之后的旧版使用情况只会在完整gc时下降。如果这是你的情况,那么这将足以识别完整的GC。 – Ron 2011-02-02 16:42:31
[这可能会给你一些见解](https://gist.github.com/khotyn/1520947)在你测试你的代码的JVM上启用了哪种GC类型 – KJ50 2014-08-25 23:37:06