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

问题描述 投票:0回答:1

根据我在网上阅读的内容,听起来很多人建议设置

-XX:+PerfDisableSharedMem
JVM 标志来修复由于垃圾收集器尝试写入
/tmp
(hsperfdata) 时 IO 阻塞而导致的高 GC 暂停延迟。

我正在尝试优化系统垃圾收集的性能,并且我尝试在设置

-XX:+PerfDisableSharedMem
标志之前和之后运行负载测试,并且它实际上在没有 标志的情况下表现得更好!我什至第二次重新运行负载测试并得到相同的结果。

所以我的问题是:

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

(我知道使用 

-XX:+PerfDisableSharedMem

将意味着依赖于该文件的某些诊断工具(例如

jstat
)将无法工作,但我们不使用任何这些工具 - 我只是询问潜在的
性能
缺点,而不是工具缺点。)

java garbage-collection jvm
1个回答
6
投票
性能计数器

,可以通过各种可服务性工具读取。 默认情况下,这些性能计数器会导出到文件系统的

/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 更新计数器的方式完全相同;唯一的区别是计数器内存是否映射到文件。

    

© www.soinside.com 2019 - 2024. All rights reserved.