亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java boolean占用內(nèi)存大小說(shuō)明

 更新時(shí)間:2021年06月04日 09:17:35   作者:云夢(mèng)九章  
這篇文章主要介紹了java boolean占用內(nèi)存大小,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

答案:4B或1B

詳細(xì)

1、如果boolean是單獨(dú)使用:boolean占4個(gè)字節(jié)。

2、如果boolean是以boolean數(shù)組形式使用:boolean占1個(gè)字節(jié)

解釋

1、JVM沒(méi)有提供boolean類(lèi)型專(zhuān)用的字節(jié)指令,而是使用int相關(guān)指令來(lái)代替。

2、對(duì)boolean數(shù)組的訪問(wèn)與修改,會(huì)共用byte數(shù)組的baload和bastore指令。

分析結(jié)論

上面的第一個(gè)結(jié)論是說(shuō):boolean在底層實(shí)際調(diào)用int,那么既然int占4個(gè)字節(jié),boolean頁(yè)自然占4個(gè)字節(jié)。即 boolean類(lèi)型占4個(gè)字節(jié)。

上面的第2個(gè)結(jié)論是說(shuō):boolean數(shù)組在底層會(huì)用byte指令,那么既然byte占1個(gè)字節(jié),boolean數(shù)組中的boolean也就占1個(gè)字節(jié),即,boolean數(shù)組中的boolean占1個(gè)字節(jié)。

擴(kuò)展

1、因此,大多數(shù)對(duì)于boolean,byte,char和short類(lèi)型數(shù)據(jù)的操作,實(shí)際都提升int,并使用int做為運(yùn)算類(lèi)型,所以他們占4個(gè)字節(jié),實(shí)際上,虛擬機(jī)規(guī)范也只有4字節(jié)和8字節(jié)類(lèi)型(long,float),boolean,char,short都是占了4字節(jié)。

2、對(duì)于在棧上(局部變量)的byte,char,short類(lèi)型的數(shù)據(jù),在內(nèi)存中的確會(huì)占4字節(jié),但這對(duì)于(數(shù)組)對(duì)象來(lái)說(shuō)并不適用。

java各種類(lèi)型對(duì)象占用內(nèi)存情況分析

經(jīng)典篇,有圖有真相

為什么寫(xiě)這篇文章?

其實(shí)一般的程序猿根本不用了解這么深,只有當(dāng)你到了一定層次,需要了解jvm內(nèi)部運(yùn)行機(jī)制,或者高并發(fā)多線程下,你寫(xiě)的代碼對(duì)內(nèi)存有影響,你想做性能優(yōu)化。。。等等等等,一句話,當(dāng)你想深入了解java對(duì)象在內(nèi)存中,如何存儲(chǔ),或者每個(gè)對(duì)象占用多大空間時(shí),你會(huì)感謝這篇文章

本文主要分析jvm中的情況,實(shí)驗(yàn)環(huán)境為64位window10系統(tǒng)、JDK1.8,使用JProfiler進(jìn)行結(jié)論驗(yàn)證

很多描述以及 概念是基于你懂基本java知識(shí)的,如果你看起來(lái)有點(diǎn)吃力,要加油咯

基本數(shù)據(jù)類(lèi)型占用

類(lèi)型 占用空間
boolean、byte 1byte
short、char 2byte
int、float 4byte
long、double 8byte

接下來(lái)用JProfiler驗(yàn)證:

新建一個(gè)空對(duì)象,觀察空對(duì)象內(nèi)存占用

public class TestObject {
}

對(duì)象占用內(nèi)存 16b,如圖

在這里插入圖片描述

結(jié)論:一般自建空對(duì)象占用內(nèi)存 16b,16 = 12 + 4

在TestObj中新增一個(gè) int 屬性,觀察對(duì)象內(nèi)存占用

public class TestObj {
    private int i;
}

對(duì)象占用內(nèi)存 16b,如圖

在這里插入圖片描述

結(jié)論:int 占用 4b, 4 = 16 -12

在TestObj中新增一個(gè) long 屬性,觀察對(duì)象內(nèi)存占用

public class TestObj {
    private long i;
}

對(duì)象占用內(nèi)存 24b,如圖

在這里插入圖片描述

結(jié)論:long 占用 8b, 8 = 24 -12 - 4

其余基本類(lèi)型可以參照以上自行驗(yàn)證,原理一樣

包裝類(lèi)型占用

包裝類(lèi)(Boolean/Byte/Short/Character/Integer/Long/Double/Float)占用內(nèi)存的大小等于對(duì)象頭大小加上底層基礎(chǔ)數(shù)據(jù)類(lèi)型的大小。

類(lèi)型占用空間Boolean、Byte16byteShort、Char16byteInteger、Float16byteLong、Double24byte 在TestObj中新增一個(gè) Integer 屬性,觀察對(duì)象內(nèi)存占用

類(lèi)型 占用空間
Boolean、Byte 16byte
Short、Char 16byte
Integer、Float 16byte
Long、Double 24byte
public class TestObj {
   private Integer  i =128;
}

對(duì)象占用內(nèi)存 32b,如圖

在這里插入圖片描述

結(jié)論:Integer 占用 16b, 16 = 32 - 16

特別的:-128~127 之間的封裝類(lèi)型,只占用 4b**

在TestObj中新增一個(gè) Long 屬性,觀察對(duì)象內(nèi)存占用

public class TestObj {
   private Long  l = new Long(1);
}

對(duì)象占用內(nèi)存 40b,如圖

在這里插入圖片描述

結(jié)論:Long 占用 24b, 16 = 40 - 16

其余包裝類(lèi)型可以參照以上自行驗(yàn)證,原理一樣

基本類(lèi)型數(shù)組占用

64位機(jī)器上,數(shù)組對(duì)象的對(duì)象頭占用24 bytes,啟用壓縮后占用16字節(jié)。比普通對(duì)象占用內(nèi)存多是因?yàn)樾枰~外的空間存儲(chǔ)數(shù)組的長(zhǎng)度(普通16b-12b)。

對(duì)象數(shù)組本身的大小=數(shù)組對(duì)象頭 + length * 存放單個(gè)元素大小

在TestObj中新增一個(gè) char[] 屬性,觀察對(duì)象內(nèi)存占用

public class TestObj {
   private char[] c = {'a','b','c'};
}

對(duì)象占用內(nèi)存 40b,如圖

在這里插入圖片描述

結(jié)論:char[3] 占用 24b, 24 = 40 - 16,24 = 16 + 3 * 2 + 2

封裝類(lèi)型數(shù)組占用

封裝類(lèi)型數(shù)組比基本類(lèi)型的數(shù)組,需要多管理元素的引用

對(duì)象數(shù)組本身的大小=數(shù)組對(duì)象頭+length 引用指針大小 + length 存放單個(gè)元素大小

在TestObj中新增一個(gè) Integer[] 屬性,觀察對(duì)象內(nèi)存占用

public class TestObj {
    private Integer[] i = {128,129,130};
}

對(duì)象占用內(nèi)存 80b,如圖

在這里插入圖片描述

結(jié)論:Integer[3] 占用 80b, 80 = 96 - 16 , 80 = 16 + 3 4 + 3 16 +4

String占用內(nèi)存 在TestObj中新增一個(gè)空 String 屬性,觀察對(duì)象內(nèi)存占用

public class TestObj {
    private String s = new String("");
}

對(duì)象占用內(nèi)存 40b,如圖

在這里插入圖片描述

結(jié)論:String 本身占用 24b, 24 = 40 -16,另外,String的屬性value還需要 16b,也就是說(shuō)空””也需要16b

注意:這里為什么要寫(xiě)String s = new String(“”)?請(qǐng)自己思考,不寫(xiě)會(huì)怎么樣?

答:如果寫(xiě)成String s = “”,是不會(huì)再堆中開(kāi)辟內(nèi)存的,也就看不到String占用的空間,你看到的將會(huì)是下面的,至于為什么,都是因?yàn)閒inal

在這里插入圖片描述

ArrayList, HashMap的內(nèi)存占用

這些參考文章開(kāi)頭提到的那篇文章,下面給出計(jì)算公式:

一個(gè)ArrayList實(shí)例本身的的大小為

12(header) + 4(modCount) + 4(size) + 4(elementData reference) = 24 (bytes)

下面分析一個(gè)只有一個(gè)Integer(1)元素的ArrayList實(shí)例占用的內(nèi)存大小。

ArrayList<Integer> testList = Lists.newArrayList();
testList.add(1);

根據(jù)上面對(duì)ArrayList原理的介紹,當(dāng)調(diào)用add方法時(shí),ArrayList會(huì)初始化一個(gè)默認(rèn)大小為10的數(shù)組,而數(shù)組中

保存的Integer(1)實(shí)例大小為16 bytes。

則testList占用的內(nèi)存大小為:

24(ArrayList itselft) + 16(elementData array header) + 10 * 4(elemetData reference) + 16(Integer) = 96 (bytes)

JProfiler中的結(jié)果驗(yàn)證了上述分析:

在這里插入圖片描述

2. HashMap內(nèi)存占用

這里分析一個(gè)只有一組鍵值對(duì)的HashMap, 結(jié)構(gòu)如下:

Map<Integer, Integer> testMap = Maps.newHashMap();
testMap.put(1, 2);

首先分析HashMap本身的大小。HashMap對(duì)象擁有的屬性包括:

/**
   * The table, initialized on first use, and resized as
   * necessary. When allocated, length is always a power of two.
   * (We also tolerate length zero in some operations to allow
   * bootstrapping mechanics that are currently not needed.)
   */
  transient Node<K,V>[] table;
 
  /**
   * Holds cached entrySet(). Note that AbstractMap fields are used
   * for keySet() and values().
   */
  transient Set<Map.Entry<K,V>> entrySet;
 
  /**
   * The number of key-value mappings contained in this map.
   */
  transient int size;
 
  /**
   * The number of times this HashMap has been structurally modified
   * Structural modifications are those that change the number of mappings in
   * the HashMap or otherwise modify its internal structure (e.g.,
   * rehash).  This field is used to make iterators on Collection-views of
   * the HashMap fail-fast.  (See ConcurrentModificationException).
   */
  transient int modCount;
 
  /**
   * The next size value at which to resize (capacity * load factor).
   *
   * @serial
   */
  // (The javadoc description is true upon serialization.
  // Additionally, if the table array has not been allocated, this
  // field holds the initial array capacity, or zero signifying
  // DEFAULT_INITIAL_CAPACITY.)
  int threshold;
 
  /**
   * The load factor for the hash table.
   *
   * @serial
   */
  final float loadFactor;

HashMap繼承了AbstractMap<K,V>, AbstractMap有兩個(gè)屬性:

transient Set<K>        keySet;
 transient Collection<V> values;

所以一個(gè)HashMap對(duì)象本身的大小為:

12(header) + 4(table reference) + 4(entrySet reference) + 4(size) + 4(modCount) + 4(threshold) + 8(loadFactor) + 4(keySet reference) + 4(values reference) = 48(bytes)

接著分析testMap實(shí)例在總共占用的內(nèi)存大小。

根據(jù)上面對(duì)HashMap原理的介紹,可知每對(duì)鍵值對(duì)對(duì)應(yīng)一個(gè)Node對(duì)象。根據(jù)上面的Node的數(shù)據(jù)結(jié)構(gòu),一個(gè)Node對(duì)象的大小為:

12(header) + 4(hash reference) + 4(key reference) + 4(value reference)+ 4(next pointer reference) = 28 (padding) -> 32(bytes)

加上Key和Value兩個(gè)Integer對(duì)象,一個(gè)Node占用內(nèi)存總大小為:32 + 2 * 16 = 64(bytes)

JProfiler中結(jié)果:

在這里插入圖片描述

下面分析HashMap的Node數(shù)組的大小。

根據(jù)上面HashMap的原理可知,在不指定容量大小的情況下,HashMap初始容量為16,所以testMap的Node[]占用的內(nèi)存大小為:

16(header) + 16 * 4(Node reference) + 64(Node) = 144(bytes)

JProfile結(jié)果:

clipboard.png

所以,testMap占用的內(nèi)存總大小為:

48(map itself) + 144(Node[]) = 192(bytes)

JProfile結(jié)果:

在這里插入圖片描述

這里只用一個(gè)例子說(shuō)明如何對(duì)HashMap進(jìn)行占用內(nèi)存大小的計(jì)算,根據(jù)HashMap初始化容量的大小,以及擴(kuò)容的影響,HashMap占用內(nèi)存大小要進(jìn)行具體分析,不過(guò)思路都是一致的。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解

    Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解

    池化思想是一種空間換時(shí)間的思想,期望使用預(yù)先創(chuàng)建好的對(duì)象來(lái)減少頻繁創(chuàng)建對(duì)象的性能開(kāi)銷(xiāo),java中有多種池化思想的應(yīng)用,例如:數(shù)據(jù)庫(kù)連接池、線程池等,下面就來(lái)具體講講
    2023-05-05
  • springboot中的RestTemplate使用詳解

    springboot中的RestTemplate使用詳解

    這篇文章主要介紹了springboot中的RestTemplate使用詳解,RestTemplate繼承自InterceptingHttpAccessor并且實(shí)現(xiàn)了RestOperations接口,其中RestOperations接口定義了基本的RESTful操作,這些操作在RestTemplate中都得到了實(shí)現(xiàn),需要的朋友可以參考下
    2023-09-09
  • SpringBoot如何根據(jù)目錄結(jié)構(gòu)生成API接口前綴

    SpringBoot如何根據(jù)目錄結(jié)構(gòu)生成API接口前綴

    這篇文章主要介紹了SpringBoot如何根據(jù)目錄結(jié)構(gòu)生成API接口前綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Spring Boot集成redis,key自定義生成方式

    Spring Boot集成redis,key自定義生成方式

    這篇文章主要介紹了Spring Boot集成redis,key自定義生成方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java事件處理機(jī)制(自定義事件)實(shí)例詳解

    Java事件處理機(jī)制(自定義事件)實(shí)例詳解

    這篇文章主要介紹了Java事件處理機(jī)制(自定義事件)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • IDEA 2021.2 激活教程及啟動(dòng)報(bào)錯(cuò)問(wèn)題解決方法

    IDEA 2021.2 激活教程及啟動(dòng)報(bào)錯(cuò)問(wèn)題解決方法

    這篇文章主要介紹了IDEA 2021.2 啟動(dòng)報(bào)錯(cuò)及激活教程,文章開(kāi)頭給大家介紹了idea2021最新激活方法,關(guān)于idea2021啟動(dòng)報(bào)錯(cuò)的問(wèn)題小編也給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 一篇文章徹底理解SpringIOC、DI

    一篇文章徹底理解SpringIOC、DI

    這篇文章主要給大家介紹了關(guān)于對(duì)SpringIOC、DI的理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java微信支付功能實(shí)現(xiàn)源碼

    java微信支付功能實(shí)現(xiàn)源碼

    這篇文章主要給大家介紹了關(guān)于java微信支付功能實(shí)現(xiàn)源碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 解決spring security中遇到的問(wèn)題

    解決spring security中遇到的問(wèn)題

    這篇文章主要介紹了解決spring security中遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Maven環(huán)境安裝配置和新建項(xiàng)目介紹

    Maven環(huán)境安裝配置和新建項(xiàng)目介紹

    這篇文章介紹了Maven環(huán)境安裝配置和新建項(xiàng)目介紹,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評(píng)論