我正在使用Java 5,我们的自定义服务器应用程序需要GC调整,因为有时我们在高峰时段会遇到15-20秒的暂停。我们在服务器类机器上运行Java 5,其中包含-server -d64
有没有办法告诉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有任何性能或行为影响吗?
答案 0 :(得分:5)
您可以使用-XX:+ PrintFlagsFinal打印出JVM参数及其设置。
java -XX:+ PrintFlagsFinal -server -version
答案 1 :(得分:2)
您可以使用jmap -heap <jvm_pid>
来打印Java堆摘要。例如,如果我运行jmap -heap 2592
:
附加到进程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/
答案 4 :(得分:0)
如果GC成为问题,我建议您查看Java RTS (real-time system)。
Java RTS允许您对GC的工作时间进行精确控制。这意味着您可以完全控制最坏情况,因此可以模拟系统在可能的压力条件下的性能。