本文介紹了計(jì)算Java對(duì)象占用了多少空間的方法,分享給大家供大家參考,具體內(nèi)容如下
一、對(duì)象頭
對(duì)象的頭部至少有兩個(gè)WORD,如果是數(shù)組的話(huà),那么三個(gè)WORD,內(nèi)容如下:
- 1、對(duì)象的HashCode,鎖信息等
- 2、到對(duì)象類(lèi)型數(shù)據(jù)的指針
- 3、數(shù)組的長(zhǎng)度(如果是數(shù)組的話(huà))
二、規(guī)則
首先,任何對(duì)象都是8字節(jié)對(duì)齊,屬性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的順序存放,舉個(gè)例子:
1
2
3
4
5
6
7
|
public class Test { byte a; int b; boolean c; long d; Object e; } |
如果這個(gè)對(duì)象的屬性按照順序存放的話(huà),要占用的空間為:head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40。但是按照這個(gè)規(guī)則得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32。可以看到節(jié)省了不少空間。
在涉及繼承關(guān)系的時(shí)候有一個(gè)最基本的規(guī)則:首先存放父類(lèi)中的成員,接著才是子類(lèi)中的成員,舉個(gè)例子:
1
2
3
4
5
6
7
8
|
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。那如果父類(lèi)中的屬性不夠八個(gè)字節(jié)怎么辦?這樣就有了新的一條規(guī)則:父類(lèi)中最后一個(gè)成員與子類(lèi)的第一個(gè)成員的間隔如果不夠4個(gè)字節(jié),此時(shí)需要擴(kuò)展到4個(gè)字節(jié)的基本單位,舉個(gè)例子:
1
2
3
4
5
6
|
class A { byte a; } class B extends A { byte b; } |
那么此時(shí)占用的空間如下:head(8) + a(1) + padding(3) + b(1) + padding(3) = 16。顯然這種方式比較浪費(fèi)空間,那么就有了:如果子類(lèi)的第一個(gè)成員是double或者long,并且父類(lèi)并沒(méi)有用完8個(gè)字節(jié),JVM會(huì)破壞規(guī)將較小的數(shù)據(jù)填充到該空間,舉個(gè)例子:
1
2
3
4
5
6
7
8
|
class A { byte a; } class B extends A { long b; short c; byte d; } |
此時(shí)占用的空間如下:head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24。
以上就是計(jì)算Java對(duì)象占用了多少空間的方法,希望對(duì)大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。