我想跟進這篇博客中的一些技巧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 –