find哪种types的垃圾收集器正在运行

发布JSE 5人机工程学旨在自动为您select合适的垃圾收集器types(除其他外)。

我想知道是否有任何方法来确认/了解垃圾收集器的types和JVM人体工程学select/目前设置的性能目标。

java -XX:+PrintCommandLineFlags -version 

会显示你的默认垃圾收集器。 我还发现下面的页面很有用,它详细介绍了各种操作系统的默认垃圾收集器。

http://www.techpaste.com/2012/02/default-jvm-settings-gc-jit-java-heap-sizes-xms-xmx-operating-systems/#more-3569

 import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.util.List; public class GCInformation { public static void main(String[] args) { try { List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans(); for (GarbageCollectorMXBean gcMxBean : gcMxBeans) { System.out.println(gcMxBean.getName()); System.out.println(gcMxBean.getObjectName()); } } catch (RuntimeException re) { throw re; } catch (Exception exp) { throw new RuntimeException(exp); } } } 

例如尝试下面的命令来了解各种GCtypes

 java -XX:+PrintCommandLineFlags GCInformation java -XX:+PrintCommandLineFlags -XX:+UseParallelGC GCInformation java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:+UseParNewGC GCInformation java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:-UseParNewGC GCInformation 

不是你的问题的直接答案,但我相信这是你在找什么。

根据Java 6文档1和2 (不只是Java 5):

参考文献1说:

在运行服务器虚拟机的服务器级机器上,垃圾收集器(GC)已经从前一个串行收集器变成了一个并行收集器

参考2说:

从J2SE 5.0开始,当应用程序启动时,启动程序可以尝试检测应用程序是否在“服务器级”计算机上运行,​​如果是,则使用Java HotSpot服务器虚拟机(服务器VM)而不是Java HotSpot客户端虚拟机(客户端VM)。

另外,参考文献2说:

注意:对于Java SE 6,服务器级机器的定义是至less有2个CPU和至less2GB物理内存的机器。

从这个信息,你可以知道,如果该框是一个服务器(根据2 ),那么它将使用并行GC。 你也可以推断它在运行时不会改变GC。

如果您深入研究文档,您可以find非服务器机器的正确答案。

 -XX:+PrintGC -XX:+PrintGCDetails 

这将打印使用GC的内容。 在我的情况下,它打印:

 [GC (Allocation Failure) [PSYoungGen: 348192K->32K(348672K)] 356792K->8632K(1048064K), 0.0111518 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

这意味着并行垃圾收集器正在被年轻一代使用。 “分配失败”是指由于年轻代堆部分空间不足而开始垃圾收集。

这个命令打印正在运行的JVM的GCtypes:

jmap -heap <pid> | grep GC

对于现代计算机(多CPU,大内存),JVM会将其检测为服务器机器,默认情况下使用Parallel GC ,除非您明确指定要通过JVM标志使用哪个gc。

例如

jmap -heap 26806 | grep GC

输出:

8线程并行GC

使用GarbageCollectorMXBean来获得MemoryPoolMXBean 。

以下是关于如何以编程方式获取GC信息的一些信息,但它看起来可能事先需要GC的名称。 麻烦。

http://blogs.oracle.com/poonam/entry/how_to_programmatically_obtain_gc

编辑:尝试ManagementFactory.getGarbageCollectorMXBeans()并遍历返回的列表。 其中之一将是积极的。

您可以使用-XX标志来selectJRE的垃圾收集器。

使用5.0 Java TM虚拟机调整垃圾收集

另外,您可以使用JConsole监视垃圾回收。