Java 有没有办法告诉JVM当前使用的是哪种GC算法
我使用的是Java5,我们的定制服务器应用程序需要GC调试,因为有时我们在高峰时间会遇到15-20秒的暂停。我们正在一台服务器级机器上运行Java5,机器上有JVM参数,如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)
-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