2016-12-06 62 views
0

我想知道是否可以通過設置對象頭的標記字中的一個位來防止對象被GC移動(嘗試欺騙GC)。通過修改對象頭的掩碼字中的位來固定對象

所以基本上我想知道如果這樣可以確保一個標記的對象總是具有相同的內存地址。

+0

直接緩衝區位於堆外,因此它們的內存不會被移動 – the8472

+0

是的,但問題不在於在堆外部存儲某些內容。我真的很想知道是否有辦法(暫時)阻止對象被移動。 –

+0

好吧,具有非移動GC的JVM會自動具有該行爲。並且一些JVM可能會將對象鎖定提供爲顯式特性。熱點沒有。 – the8472

回答

1

不,HotSpot JVM不支持任何形式的對象鎖定,即使在JVM內部也是如此。

不要嘗試修改對象頭。否則JVM很有可能會崩潰。標題的內容可能會因JVM版本,參數和選定的GC算法而異。 JVM可以完全控制對象頭並且不準備進行外部更改。

+0

慚愧但謝謝!你有沒有關於這些話題的好的閱讀建議(其他的OpenJDK源代碼)。就像更新過的「Java虛擬機內部」一樣,它也包含了如何真正使用對象頭文件等細節。 –

+0

@HaasipSatang我不知道任何,對不起。我相信源代碼是最好的。通過這種方式,HotSpot JVM資源得到了很好的記錄。您還可以查找有關JVM內部結構的會議演示,例如[this one](https://www.infoq.com/presentations/hotspot-memory-data-structures)。 – apangin