一般64位JVM消耗的內存會比32位的大1.5倍,這是由於對象指針在64位架構下,長度會翻倍(更寬的尋址)。 對於那些將要從32位平臺移植到64位的應用來講,平白無辜多了1/2的內存佔用,這是開發者不肯意看到的。 幸運的是,從JDK 1.6 update14開始,64 bit JVM正式支持了 -XX:+UseCompressedOops 這個能夠壓縮指針,起到節約內存佔用的新參數。數組
什麼是 OOP ?OOP = 「ordinary object pointer」 普通對象指針。架構
啓用CompressOops後,會壓縮的對象: • 每一個Class的屬性指針(靜態成員變量) • 每一個對象的屬性指針 • 普通對象數組的每一個元素指針ide
固然,壓縮也不是萬能的,針對一些特殊類型的指針,JVM是不會優化的。 好比指向PermGen的Class對象指針,本地變量,堆棧元素,入參,返回值,NULL指針不會被壓縮。oop
CompressedOops的原理原理,解釋器在解釋字節碼時,植入壓縮指令(不影響正常和JVM優化後的指令順序)。 具體邏輯是,當對象被讀取時,解壓,存入heap時,壓縮。優化
壓縮指令僞碼指針
! int R8; oop[] R9; // R9 is 64 bits ! oop R10 = R9[R8]; // R10 is 32 bits ! load compressed ptr from wide base ptr: movl R10, [R9 + R8<<3 + 16] ! klassOop R11 = R10._klass; // R11 is [...]對象