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
也可以看到:

指針壓縮
當我們啟用了-XX:+UseCompressedOops
之后,我們原本的OOP(Ordinary Object Pointer,普通對象指針)就會被壓縮,當然也不是所有的對象都會被壓縮,只有 以下幾種的對象才會被壓縮
對象的全局靜態變量(類屬性)
對象頭信息
對象的引用類型
對象數組類型
而以下幾種對象則不能被壓縮:
指向PermGen的Class對象指針
局部變量
傳參
返回值
NULL指針
指針壓縮的大概原理:
通過對齊,還有偏移量將64位指針壓縮成32位。
零基壓縮是針對壓縮解壓動作的進一步優化。 它通過改變正常指針的隨機地址分配特性,強制堆地址從零開始分配。

這里需要注意:32位HotSpot VM是不支持UseCompressedOops參數的,只有64位HotSpot VM才支持。
下面是32bit和64bit下的壓縮或者不壓縮所占的大小~

在內存結構中的不同
