若何盤算Java對象占用了若干空間?。本站提示廣大學習愛好者:(若何盤算Java對象占用了若干空間?)文章只能為提供參考,不一定能成為您想要的結果。以下是若何盤算Java對象占用了若干空間?正文
本文引見了盤算Java對象占用了若干空間的辦法,分享給年夜家供年夜家參考,詳細內容以下
1、對象頭
對象的頭部至多有兩個WORD,假如是數組的話,那末三個WORD,內容以下:
2、規矩
起首,任何對象都是8字節對齊,屬性依照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的次序寄存,舉個例子:
public class Test { byte a; int b; boolean c; long d; Object e; }
假如這個對象的屬性依照次序寄存的話,要占用的空間為:head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40。然則依照這個規矩獲得:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32。可以看到節儉了很多空間。
在觸及繼續關系的時刻有一個最根本的規矩:起首寄存父類中的成員,接著才是子類中的成員,舉個例子:
class A { long a; int b; int c; } class B extends A { long d; }
如許寄存的次序及占用空間以下:head(8) + a(8) + b(4) + c(4) + d(8) = 32。那假如父類中的屬性不敷八個字節怎樣辦?如許就有了新的一條規矩:父類中最初一個成員與子類的第一個成員的距離假如不敷4個字節,此時須要擴大到4個字節的根本單元,舉個例子:
class A { byte a; } class B extends A { byte b; }
那末此時占用的空間以下:head(8) + a(1) + padding(3) + b(1) + padding(3) = 16。明顯這類方法比擬糟蹋空間,那末就有了:假如子類的第一個成員是double或許long,而且父類並沒有效完8個字節,JVM會損壞規將較小的數據填充到該空間,舉個例子:
class A { byte a; } class B extends A { long b; short c; byte d; }
此時占用的空間以下:head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24。
以上就是盤算Java對象占用了若干空間的辦法,願望對年夜家進修java法式設計有所贊助。