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

如何計(jì)算Java對象占用了多少空間?

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

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

一、對象頭

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

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

二、規(guī)則

首先,任何對象都是8字節(jié)對齊,屬性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的順序存放,舉個(gè)例子:

public class Test {
  byte a;
  int b;
  boolean c;
  long d;
  Object e;
}

如果這個(gè)對象的屬性按照順序存放的話,要占用的空間為: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ī)則:首先存放父類中的成員,接著才是子類中的成員,舉個(gè)例子:

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

    在Spring Boot中,依賴注入是一項(xiàng)關(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í)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java String中移除空白字符的多種方式匯總

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

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

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

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

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

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

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

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

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

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

最新評論