程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 若何盤算Java對象占用了若干空間?

若何盤算Java對象占用了若干空間?

編輯:關於JAVA

若何盤算Java對象占用了若干空間?。本站提示廣大學習愛好者:(若何盤算Java對象占用了若干空間?)文章只能為提供參考,不一定能成為您想要的結果。以下是若何盤算Java對象占用了若干空間?正文


本文引見了盤算Java對象占用了若干空間的辦法,分享給年夜家供年夜家參考,詳細內容以下

1、對象頭

對象的頭部至多有兩個WORD,假如是數組的話,那末三個WORD,內容以下:

  • 1、對象的HashCode,鎖信息等
  • 2、到對象類型數據的指針
  • 3、數組的長度(假如是數組的話)

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved