「每日五分鍾,玩轉JVM」:指針壓縮


64位JVM和32位JVM

最初的時候,JVM是32位的,但是隨着64位系統的興起,JVM也迎來了從32位到64位的轉換,32位的JVM對比64位的內存容量比較有限,但是我們使用64位虛擬機的同時,也帶來了一個問題,64位下的JVM中的對象會比32位中的對象多占用1.5倍的內存空間,這是我們不想看到的(又要馬兒跑,又要馬兒不吃草可還行?),但是機智的程序員不會屈服,所以在JDK 1.6的版本后,我們在64位中的JVM中可以開啟指針壓縮(UseCompressedOops)來壓縮我們對象指針的大小來幫助我們節約內存空間,拿JDK 8來說,這個指令是默認開啟的。

如果我想要知道我們電腦上安裝的JVM是32位的還是64位的,可以通過下面的這個命令去查看

如果我們的系統是64位的,當我們輸入java -d32的時候會提示不支持32位的JVM,或者我們通過java -version也可以看到:

image-20190911201937600
image-20190911201937600

指針壓縮

當我們啟用了-XX:+UseCompressedOops之后,我們原本的OOP(Ordinary Object Pointer,普通對象指針)就會被壓縮,當然也不是所有的對象都會被壓縮,只有 以下幾種的對象才會被壓縮

對象的全局靜態變量(類屬性)

對象頭信息

對象的引用類型

對象數組類型

而以下幾種對象則不能被壓縮:

指向PermGen的Class對象指針

局部變量

傳參

返回值

NULL指針

指針壓縮的大概原理:

  • 通過對齊,還有偏移量將64位指針壓縮成32位。

  • 零基壓縮是針對壓縮解壓動作的進一步優化。 它通過改變正常指針的隨機地址分配特性強制堆地址從零開始分配

image-20190911203525671
image-20190911203525671

這里需要注意:32位HotSpot VM是不支持UseCompressedOops參數的,只有64位HotSpot VM才支持。

下面是32bit和64bit下的壓縮或者不壓縮所占的大小~

image-20190911221738200
image-20190911221738200

在內存結構中的不同

image-20190823231212050
image-20190823231212050

公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM