我怎样才能看到java正在使用哪个垃圾收集器

Java虚拟机支持多种垃圾收集策略。

本文解释了它们。

现在我想知道我的应用程序正在使用哪种(自动选择)策略,有没有办法让JVM(版本1.6)打印这些信息?

编辑:JVM检测它是处于客户端还是服务器模式。 所以问题是我如何才能看到哪些被发现?

http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html适用于J2SE 6,并声明默认为Parallel Collector。

我们仅通过设置在JVM 1.5上测试了一次

-server -Xms3g -Xmx3g -XX:PermSize=128m -XX:LargePageSizeInBytes=4m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

并且输出显示

 41359.597:[GC [PSYoungGen:90499K-> 32K(377344K)] 268466K-> 181862K(2474496K),0.0183138 secs]
 41359.615:[Full GC [PSYoungGen:32K-> 0K(377344K)] [PSOldGen:181830K-> 129760K(2097152K)] 181862K-> 129760K(2474496K)[PSPermGen:115335K-> 115335K(131072K)],4.4590942 secs]

其中PS代表Parallel Scavenging

jmap -heap

打印堆摘要。 使用GC算法,堆配置和生成明智的堆使用被打印。

http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

把它放在JAVA_OPTS中:

 -XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

对于UseSerialGC,我们将在日志中看到:

  7.732: [GC 7.732: [DefNew: 419456K->47174K(471872K), 0.1321800 secs] 419456K->47174K(1520448K), 0.1322500 secs] [Times: user=0.10 sys=0.03, real=0.14 secs] 

对于UseConcMarkSweepGC,我们将在日志中看到:

  5.630: [GC 5.630: ['ParNew: 37915K->3941K(38336K), 0.0123210 secs] 78169K->45163K(1568640K), 0.0124030 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

对于UseParallelGC,我们将在日志中看到:

 30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs] 

正如Joachim已经指出的那样,您所引用的文章描述了Sun的VM提供的VM策略。 VM规范本身并不强制要求特定的GC算法,因此在API中具有例如这些枚举值是没有意义的。

但是,您可以从Management API获取一些信息:

 List beans = ManagementFactory.getGarbageCollectorMXBeans(); 

迭代这些bean,您可以获取GC的名称(尽管只作为字符串)和内存池的名称,这些名称由不同的GC管理。

看起来,我们有更方便的方法在运行时定义GC的版本。 总是使用工具,我的建议。 要定义GC版本,我们需要两个JVM附带的工具(放在jdk/bin目录中):

  1. VisualVM – 启动它并尝试分析某些进程(例如,您可以对VisualVM本身进行概要分析)。 您的个人资料将显示进程的PID (请参见屏幕截图中的绿色矩形)。
  2. jMap – 使用-heap 选项启动此工具,并找到专用于垃圾收集器类型的字符串(请参见屏幕截图中的粉红色线条)

在此处输入图像描述

你可以编写通过jmx连接到java进程的简单程序:

 public class PrintJMX { public static void main(String[] args) throws Exception { String rmiHostname = "localhost"; String defaultUrl = "service:jmx:rmi:///jndi/rmi://" + rmiHostname + ":1099/jmxrmi"; JMXServiceURL jmxServiceURL = new JMXServiceURL(defaultUrl); JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL); MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection(); ObjectName gcName = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*"); for (ObjectName name : mbsc.queryNames(gcName, null)) { GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(mbsc, name.getCanonicalName(), GarbageCollectorMXBean.class); System.out.println(gc.getName()); } } } 

获得此function的最佳方法是:转到命令行并输入以下命令。

java -XX:+ PrintCommandLineFlags -version

它会显示如下结果:

 C:\windows\system32>java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=132968640 -XX:MaxHeapSize=2127498240 -XX:+PrintCommandLineFl ags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesInd **ividualAllocation -XX:+UseParallelGC** java version "1.8.0_66" Java(TM) SE Runtime Environment (build 1.8.0_66-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)`enter code here`