欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何計算Java對象占用了多少空間?

 更新時間:2016年01月10日 17:03:51   投稿:lijiao  
在Java中沒有sizeof運算符,所以沒辦法知道一個對象到底占用了多大的空間,但是在分配對象的時候會有一些基本的規(guī)則,我們根據(jù)這些規(guī)則大致能判斷出來對象大小,需要的朋友可以參考下

本文介紹了計算Java對象占用了多少空間的方法,分享給大家供大家參考,具體內(nèi)容如下

一、對象頭

對象的頭部至少有兩個WORD,如果是數(shù)組的話,那么三個WORD,內(nèi)容如下:

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

二、規(guī)則

首先,任何對象都是8字節(jié)對齊,屬性按照[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。但是按照這個規(guī)則得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32??梢钥吹焦?jié)省了不少空間。

在涉及繼承關(guān)系的時候有一個最基本的規(guī)則:首先存放父類中的成員,接著才是子類中的成員,舉個例子:

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。那如果父類中的屬性不夠八個字節(jié)怎么辦?這樣就有了新的一條規(guī)則:父類中最后一個成員與子類的第一個成員的間隔如果不夠4個字節(jié),此時需要擴(kuò)展到4個字節(jié)的基本單位,舉個例子:

class A {
  byte a;
}
class B extends A {
  byte b;
}

那么此時占用的空間如下:head(8) + a(1) + padding(3) + b(1) + padding(3) = 16。顯然這種方式比較浪費空間,那么就有了:如果子類的第一個成員是double或者long,并且父類并沒有用完8個字節(jié),JVM會破壞規(guī)將較小的數(shù)據(jù)填充到該空間,舉個例子:

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對象占用了多少空間的方法,希望對大家學(xué)習(xí)java程序設(shè)計有所幫助。

相關(guān)文章

  • 探究Java常量本質(zhì)及三種常量池(小結(jié))

    探究Java常量本質(zhì)及三種常量池(小結(jié))

    這篇文章主要介紹了探究Java常量本質(zhì)及三種常量池(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java之MyBatis的Dao方式以及Dao動態(tài)代理詳解

    Java之MyBatis的Dao方式以及Dao動態(tài)代理詳解

    這篇文章主要介紹了Java之MyBatis的Dao方式以及Dao動態(tài)代理詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java 設(shè)計模式之單例的實例詳解

    java 設(shè)計模式之單例的實例詳解

    這篇文章主要介紹了java 設(shè)計模式之單例的實例詳解的相關(guān)資料, 希望通過本文能幫助到大家,讓大家徹底理解掌握單例模式,需要的朋友可以參考下
    2017-09-09
  • SpringBoot依賴注入的詳細(xì)介紹、使用技巧

    SpringBoot依賴注入的詳細(xì)介紹、使用技巧

    在Spring Boot中,依賴注入是一項關(guān)鍵的特性,它通過容器來管理和注入應(yīng)用程序中的各種組件,本文介紹SpringBoot依賴注入的詳細(xì)介紹、使用技巧,感興趣的朋友一起看看吧
    2024-01-01
  • java構(gòu)造http請求的幾種方式(附源碼)

    java構(gòu)造http請求的幾種方式(附源碼)

    本文主要介紹了java構(gòu)造http請求的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java String中移除空白字符的多種方式匯總

    Java String中移除空白字符的多種方式匯總

    這篇文章主要給大家介紹了關(guān)于Java String中移除空白字符的多種方式,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 手工搭建Servlet實現(xiàn)

    手工搭建Servlet實現(xiàn)

    現(xiàn)在作為一個Java程序員,我們已經(jīng)習(xí)慣了使用IDE和Web框架進(jìn)行開發(fā),IDE幫助我們做了編譯、打包的工作。Spring框架則幫助我們實現(xiàn)了Servlet接口,并把Servlet容器注冊到了Web容器中。本文主要介紹了Servlet手工搭建,感興趣的可以了解一下
    2021-07-07
  • java 進(jìn)制轉(zhuǎn)換實例詳解

    java 進(jìn)制轉(zhuǎn)換實例詳解

    這篇文章主要介紹了java 進(jìn)制轉(zhuǎn)換實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java循環(huán)隊列原理與用法詳解

    Java循環(huán)隊列原理與用法詳解

    這篇文章主要介紹了Java循環(huán)隊列原理與用法,結(jié)合實例形式詳細(xì)分析了Java循環(huán)隊列基本概念、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-03-03
  • 關(guān)于Java使用Http輕量級請求庫Unirest的方法

    關(guān)于Java使用Http輕量級請求庫Unirest的方法

    這篇文章主要介紹了關(guān)于Java使用Http輕量級請求庫Unirest的方法,Unirest 是一個輕量級的 HTTP 請求庫,可發(fā)起 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS 請求,支持 Node、Ruby、Java、PHP、Python、Objective-C、.NET 等多種語言,需要的朋友可以參考下
    2023-08-08

最新評論