【问题标题】:Is there any performance downsides to using the `-XX:+PerfDisableSharedMem` JVM flag?使用 `-XX:+PerfDisableSharedMem` JVM 标志是否有任何性能劣势?
【发布时间】:2021-06-22 16:32:27
【问题描述】:

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

我正在尝试优化我们系统的垃圾回收性能,并尝试在设置 -XX:+PerfDisableSharedMem 标志之前和之后运行负载测试,实际上它的性能略好没有 旗帜!我什至再次重新运行负载测试并得到相同的结果。

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

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

【问题讨论】:

    标签: java garbage-collection jvm


    【解决方案1】:

    HotSpot JVM 维护着特定的Performance Counters,可以被各种服务工具读取。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      相关资源
      最近更新 更多