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

Java 有没有办法告诉JVM当前使用的是哪种GC算法,java,garbage-collection,jvm-arguments,Java,Garbage Collection,Jvm Arguments,我使用的是Java5,我们的定制服务器应用程序需要GC调试,因为有时我们在高峰时间会遇到15-20秒的暂停。我们正在一台服务器级机器上运行Java5,机器上有JVM参数,如-server-d64 有没有办法告诉JVM当前使用的是哪种GC算法 在运行服务器VM的服务器级计算机上,垃圾收集器(GC)已从以前的串行收集器(-XX:+UseSerialGC)更改为并行收集器(-XX:+UseParallelGC)。您可以使用java命令的-XX:+UseSerialGC命令行选项来覆盖此默认值 1)

我使用的是Java5,我们的定制服务器应用程序需要GC调试,因为有时我们在高峰时间会遇到15-20秒的暂停。我们正在一台服务器级机器上运行Java5,机器上有JVM参数,如
-server-d64

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

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

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

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

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log -详细信息:gc-XX:+PrintGCTimeStamps-XX:+PrintGCDetails-XX:+PrintGCApplicationStoppedTime-XX:+PrintgcApplicationncCurrentTime-Xloggc:logs/gc.log
2) 除了记录GC日志之外,它们会对运行中的JVM产生任何性能或行为影响吗?

如果GC正在成为一个问题,我建议您进行研究。

JavaRTS允许您精确控制GC的工作时间。这意味着您完全可以控制最坏的情况,因此可以模拟您的系统在可能的满负荷条件下的性能。

您可以使用


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

将可视虚拟机连接到进程并检查MBean。如果您以前从未使用过它(这是Oracle JDK下载的一部分),那么您可能需要安装MBean插件(这很容易)


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


java-XX:+printflasfinal-server-version

您可以使用
jmap-heap
打印java堆摘要。例如,如果我运行
jmap-heap 2592
,Intellij的堆摘要如下所示:

正在附加到进程ID 2592,请稍候…
已附加调试器 已成功。
检测到服务器编译器。
JVM版本为 25.101-b13

在新一代中使用并行线程。
使用本地线程 对象分配。
并发标记扫描GC
截断的

从输出中可以看出,使用2592进程id运行的JVM实例正在使用CMS GC算法

另外,如果算法是由那些
-XX:+Use*GC
标志确定的,那么您可以使用
jcmd 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正在使用并行GC