根据我在网上阅读的内容,听起来很多人建议设置
-XX:+PerfDisableSharedMem
JVM 标志来修复由于垃圾收集器尝试写入 /tmp
(hsperfdata) 时 IO 阻塞而导致的高 GC 暂停延迟。
我正在尝试优化系统垃圾收集的性能,并且我尝试在设置
-XX:+PerfDisableSharedMem
标志之前和之后运行负载测试,并且它实际上在没有 标志的情况下表现得更好!我什至第二次重新运行负载测试并得到相同的结果。
所以我的问题是:这只是一个侥幸,还是-XX:+PerfDisableSharedMem
实际上有任何潜在的负面性能影响?
-XX:+PerfDisableSharedMem
将意味着依赖于该文件的某些诊断工具(例如
jstat
)将无法工作,但我们不使用任何这些工具 - 我只是询问潜在的 性能缺点,而不是工具缺点。)
,可以通过各种可服务性工具读取。 默认情况下,这些性能计数器会导出到文件系统的
/tmp/hsperfdata_<user>
目录下,以便像
jstat
这样的外部工具可以读取它们,而无需直接与 JVM 通信。 jps
工具还会查找这些计数器以查找活动的 JVM。JVM不直接更新文件;相反,它将文件映射到内存并更新内存中的计数器。任何此类内存更新都可能导致文件 I/O。例如,当 GC 计数器在 GC 暂停期间更新时,操作系统可能决定将数据刷新到磁盘,这反过来可能会延长暂停时间。 这篇博文-XX:+PerfDisableSharedMem
选项强制 JVM 使用匿名内存作为性能计数器而不是映射文件。这有助于避免自发磁盘 I/O 导致的随机虚拟机暂停。
使用此选项,jps
、
jstat
、JConsole
等工具将无法找到 JVM。但是,仍会收集性能计数器。 hsperf工具无论如何都能够打印这些计数器。
-XX:+PerfDisableSharedMem
选项没有其他负面性能影响。在这两种情况下,JVM 更新计数器的方式完全相同;唯一的区别是计数器内存是否映射到文件。