有没有办法告诉JVM当前使用哪种GC算法

时间:2012-02-15 18:22:10

标签: java garbage-collection jvm-arguments

我正在使用Java 5,我们的自定义服务器应用程序需要GC调整,因为有时我们在高峰时段会遇到15-20秒的暂停。我们在服务器类机器上运行Java 5,其中包含-server -d64

等JVM args

有没有办法告诉JVM当前使用哪种GC算法?

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html

在运行服务器VM的服务器级计算机上,垃圾收集器(GC)已从先前的串行收集器(-XX:+UseSerialGC)更改为并行收集器(-XX:+UseParallelGC)。您可以使用java命令的-XX:+UseSerialGC命令行选项覆盖此默认值。

1)我想知道真的发生了吗?

我的下一个问题是 我在命令行参数

中添加了以下内容
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log

2)除了记录GC日志外,它们对正在运行的JVM有任何性能或行为影响吗?

5 个答案:

答案 0 :(得分:5)

您可以使用-XX:+ PrintFlagsFinal打印出JVM参数及其设置。

java -XX:+ PrintFlagsFinal -server -version

答案 1 :(得分:2)

您可以使用jmap -heap <jvm_pid>来打印Java堆摘要。例如,如果我运行jmap -heap 2592

,Intellij的堆摘要如下所示
  

附加到进程ID 2592,请稍候...
附带调试器   检测到服务器编译器。
JVM版本是   25.101-B13

     

在新一代中使用并行线程。
使用线程本地   对象分配。
并发Mark-Sweep GC
  截断...

正如您可以从输出中发现的那样,使用2592进程ID运行的JVM实例正在使用 CMS GC算法。

此外,如果算法由那些-XX:+Use*GC标志确定,您可以使用jcmd <pid> VM.flags找到该标志。例如:

$ jcmd 2715 VM.flags 
2715:
-XX:CICompilerCount=4 -XX:InitialHeapSize=268435456
-XX:MaxHeapSize=734003200 -XX:MaxNewSize=244318208 
-XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
-XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 

如您所见,VM正在使用 Parallel GC

答案 2 :(得分:1)

您可以使用GarbageCollectorMXBeans获取当前正在使用的gc。

几乎所有日志记录都会影响性能。

答案 3 :(得分:1)

将Visual VM附加到您的进程并检查mbeans。如果您以前从未使用它(它是Oracle JDK下载的一部分),您可能必须安装MBean插件(这很容易)

http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/

http://visualvm.java.net/mbeans_tab.html

答案 4 :(得分:0)

如果GC成为问题,我建议您查看Java RTS (real-time system)

Java RTS允许您对GC的工作时间进行精确控制。这意味着您可以完全控制最坏情况,因此可以模拟系统在可能的压力条件下的性能。