我想跟进这篇博客中的一些技巧https://www.elastic.co/blog/a-heap-of-trouble#ref5,它讨论了调整一个Java堆的好处,以便(a)可以使用压缩指针(对于32GB以下的堆)和(b)以便堆驻留在地址0在内存中。本文详细介绍了压缩指针如何更有效地利用堆空间,并解释了当堆存放在地址0时,这减少了解析指针地址所需的算术量。最后,文章说,如果我使用JVM选项-XX:+UnlockDiagnosticVMOptions
- XX:+PrintCompressedOopsMode
我会看到日志输出要么是这样的:如何确定Java堆是否使用压缩指针以及是否驻留在内存中的地址0?
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
这表明从零开始压缩哎呀启用,或输出这样
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
这表明堆开始于非零的地址,因此需要前述的算术处理增加量。
但是,当我尝试这些选项并通过我的应用程序(Elastic Search)日志目录grep'd时,我找不到这样的消息。如果任何人都可以告诉我如何强制记录零基(或不是零)的压缩指针的细节,我将非常感激。
解决方案:
伟大的答案。我接受了@ apangin的,我裹着他在shell脚本提供的Java程序,只要你有java的..可以运行,你应该如果你正在寻找Java堆!这里是脚本:https://github.com/buildlackey/scripts/blob/master/verify_compressed_pointers_from_zero_offset.sh
请注意,在这两种情况下,堆不会从零开始。但在第一种情况下,起始地址和堆大小的总和低于32GiB阈值,这允许基于零的寻址。但为什么这个问题标签为“垃圾收集”? – Holger
如果我的回答没有帮助你,请提供有关您的操作系统和ES版本的信息。 – Ivan
哇..很好的答案。我将在明天审查并尝试这些建议。作为对@Holger的回应,标记垃圾收集的原因是因为我们试图优化堆大小的设置以及其他垃圾收集相关的调整..认为这个话题与任何其他调整GC相关。 /日Thnx –