7

我正在使用 Java 5,我们的自定义服务器应用程序需要 GC 调整,因为有时我们会在高峰时段遇到 15-20 秒的暂停。我们在带有 JVM 参数的服务器类机器上运行 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)。-XX:+UseSerialGC您可以使用java 命令的命令行选项覆盖此默认值。

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

我的下一个问题是我在命令行参数中添加了以下内容

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log

2) 除了记录 GC 日志之外,它们是否会对正在运行的 JVM 产生任何性能或行为影响?

4

5 回答 5

6

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

java -XX:+PrintFlagsFinal -server -version

于 2012-10-15T23:29:21.350 回答
3

您可以使用jmap -heap <jvm_pid>打印 java 堆摘要。例如,如果我运行 Intellij 的堆摘要,则如下所示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

于 2017-01-10T10:54:34.683 回答
1

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

几乎所有的日志记录都会对性能产生影响。

于 2012-02-15T18:31:06.667 回答
1

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

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

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

于 2012-02-15T18:38:06.367 回答
0

如果 GC 成为问题,我建议您查看Java RTS(实时系统)

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

于 2012-02-15T18:25:33.997 回答