使用 `-XX:+PerfDisableSharedMem` JVM 标志是否有任何性能缺点?

Das*_*tor 1 java garbage-collection jvm

从我在网上读到的内容来看,听起来很多人建议设置-XX:+PerfDisableSharedMemJVM 标志来修复由于垃圾收集器尝试写入/tmp(hsperfdata) 时 IO 阻塞而导致的高 GC 暂停延迟。

我正在尝试优化系统垃圾收集的性能,并且我尝试在设置标志之前和之后运行负载测试,并且实际上在没有标志的情况-XX:+PerfDisableSharedMem下性能稍好一些!我什至第二次重新运行负载测试并得到相同的结果。

所以我的问题是:这只是一个侥幸,还是-XX:+PerfDisableSharedMem实际上有任何潜在的负面性能影响?

(我知道使用-XX:+PerfDisableSharedMem意味着jstat依赖于该文件的某些诊断工具将无法工作,但我们不使用任何这些工具 - 我只是询问潜在的性能缺点,而不是工具缺点。)

apa*_*gin 6

HotSpot JVM 维护某些可由各种可服务性工具读取的性能计数器。

默认情况下,这些性能计数器导出到/tmp/hsperfdata_<user>目录下的文件系统中,以便外部工具jstat可以读取它们,而无需直接与 JVM 通信。jps该工具还会查找这些计数器以查找活动的 JVM。

JVM不直接更新文件;相反,它将文件映射到内存并更新内存中的计数器。任何此类内存更新都可能导致文件 I/O。例如,当 GC 计数器在 GC 暂停期间更新时,操作系统可能决定将数据刷新到磁盘,这反过来可能会延长暂停时间。这篇博文描述了上述效果。

-XX:+PerfDisableSharedMem选项强制 JVM 使用匿名内存作为性能计数器而不是映射文件。这有助于避免自发磁盘 I/O 导致的随机 VM 暂停。

使用此选项,jpsjstatJConsole和其他工具将无法找到 JVM。但是,仍会收集性能计数器。jcmd <pid> PerfCounter.print无论如何都可以打印计数器。

该选项没有其他负面性能影响-XX:+PerfDisableSharedMem。在这两种情况下,JVM 更新计数器的方式完全相同;唯一的区别是计数器内存是否映射到文件。