日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

vc++64位系统下long的长度为4个字节_新来的妹子把几百万数据放入了内存,系统立马爆了...

發布時間:2025/3/20 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vc++64位系统下long的长度为4个字节_新来的妹子把几百万数据放入了内存,系统立马爆了... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方藍色字體,選擇“標星公眾號”

優質文章,第一時間送達

上一篇:這300G的Java資料是我師傅當年給我的,免費分享給大家

下一篇:這200G的Java實戰資料是我師傅當年教我的第

作者:不學無數的程序員

my.oschina.net/u/4030990/blog/3145683

在公司有一個需求是要核對一批數據,之前的做法是直接用SQL各種復雜操作給懟出來的,不僅時間慢,而且后期也不好維護,就算原作者來了過一個月估計也忘了SQL什么意思了,于是有一次我就想著問一下之前做這個需求的人為什么不將這些數據查出來后在內存里面做篩選呢?直接說了你不怕把內存給撐爆嗎?此核算服務器是單獨的服務器,配置是四核八G的,配置堆的大小是4G。本著懷疑的精神,就想要弄清楚幾百萬條數據真的放入內存的話會占用多少內存呢?

計算機的存儲單位

計算機的存儲單位常用的有bit、Byte、KB、MB、GB、TB后面還有但是我們基本上用不上就不說了,我們經常將bit稱之為比特或者位、將Byte簡稱為B或者字節,將KB簡稱為K,將MB稱之為M或者兆,將GB簡稱為G。那么他們的換算單位是怎樣的呢?

換算關系

首先我們得知道在計算機中所有數據都是由0 1來組成的,那么存儲0 1這些二進制數據是由什么存放呢?就是由bit存放的,一個bit存放一位二進制數字。所以bit是計算機最小的單位。

大部分計算機目前都是使用8位的塊,就是我們上面稱之為的字節Byte,來作為計算機容量的基本單位。所以我們一般稱一個字符或者一個數字都是稱之為占用了多少字節。

了解了上面關于位和字節的關系后,我們可以看一下其他的單位換算關系

1B(Byte 字節) = 8bit(位)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB

Java中對象占用多少內存

在了解了上面的換算關系后,我們來了解一下新建一個Java對象需要多少內存。

Java基本類型

我們知道Java類型分為基本類型和引用類型,八大基本類型有int、short、long、byte、float、double、boolean、char

數據類型占用內存(單位為Byte)
boolean1
byte1
short2
char2
int4
float4
long8
double8

至于為什么Java中的char無論是中英文數字都占用兩個字節,是因為Java中使用Unicode字符,所有的字符均以兩個字節存儲。

Java引用類型

在一個對象中除了有基本數據類型以外,我們也會有一些引用類型,引用類型的對象比較特殊,因為這些對象真正存儲在虛擬機中的堆內存中,對象中只是存儲了一個引用而已,如果是引用類型那么就會存儲一個指向該引用的指針。指針默認情況下是占用4字節,是因為開啟了指針壓縮,如果沒有開的話,那么一個引用就占用8個字節。

對象在內存中的布局

在HotSpot虛擬機中,對象在內存中存儲的布局可以分為三個區域:對象頭(Header)、實例數據(Instance Data)、對齊填充(Padding)。

對象頭

在對象頭中存儲了兩部分數據

  • 運行時數據:存儲了對象自身運行時的數據,例如哈希碼、GC分代的年齡、鎖狀態標志、線程持有的鎖、偏向線程ID等等。這部分數據在32位和64位的虛擬機中分別為32bit和64bit

  • 類型指針:對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。如果對象是一個Java數組的話,那么對象頭中還必須有一塊用于記錄數組長度的數據(占用4個字節)。所以這是一個指針,默認JVM對指針進行了壓縮,用4個字節存儲。

> 我們以虛擬機為64位的機器為例,那么對象頭占用的內存是8(運行時數據)+4(類型指針)=12Byte。如果是數組的話那么就是16Byte

實例數據

實例數據中也擁有兩部分數據,一部分是基本類型數據,一部分是引用指針。這兩部分數據我們在上面已經講了。具體占用多少內存我們需要結合具體的對象繼續分析,下面我們會有具體的分析。

> 從父類中繼承下來的變量也是需要進行計算的

對齊填充

對齊填充并不是必然存在的,也沒有特別的含義。它僅僅起著占位符的作用。由于HotSpot VM的自動內存管理系統要求對象起始地址必須是8字節的整數倍,換句話說就是對象的大小必須是8字節的整數倍。而如果對象頭加上實例數據不是8的整數倍的話那么就會通過對其填充進行補全。

實戰演練

我們在上面分析一大堆,那么是不是就如我們分析的一樣,新建一個對象在內存中的分配大小就是如此呢?我們可以新建一個對象。

class?Animal{

????private?int?age;

}

那么怎么知道這個對象在內存中占用多少內存呢?JDK提供了一個工具jol-core可以給我們分析出來一個對象在內存中占用的內存大小。直接在項目中引入包即可。

--Gradle
compile 'org.openjdk.jol:jol-core:0.9'

--Maven
<dependency>
????<groupid>org.openjdk.jolgroupid>
????<artifactid>jol-coreartifactid>
????<version>0.9version>
dependency>

然后我們在main函數中調用如下

public?class?AboutObjectMemory?{

????public?static?void?main(String[] args) {
????????System.out.print(ClassLayout.parseClass(Animal.class).toPrintable());
????}
}

就可以查看到輸出的內容了,可以看到輸出結果占用的內存是16字節,和我們分析的一樣。

aboutjava.other.Animal object?internals:
?OFFSET SIZE TYPE DESCRIPTION VALUE
??????0????12????????(object?header) N/A
?????12?????4????int?Animal.age N/A
Instance size: 16?bytes
Space losses: 0?bytes internal?+ 0?bytes external = 0?bytes total

String占用多少內存

String字符串在Java中是個特殊的存在,比如一個字符串"abcdefg"這樣一個字符串占用多少字節呢?相信會有人回答說是7個字節或者是14個字節,這兩個答案都是不準確的,我們先看一下String類在內存中占用的內存是多少。我們先自己進行分析一下。在String類中有兩個屬性,其中對象頭固定了是12字節,int是4字節,char[]數組其實在這里相當于引用對象存的,所以存的是地址,因此占用4個字節,所以大小為對象頭12Byte+實例數據8Byte+填充數據4Byte=24Byte這里的對象頭和實例數據加起來不是8的倍數,所以需要填充數據進行填充。

private?final char?value[];

private?int?hash; // Default to 0

那么我們分析的到底對不對呢,我們還是用上面的工具進行分析一下。可以看到我們算出的結果和我們分析的結果是一致的。

java.lang.String object?internals:
?OFFSET SIZE TYPE DESCRIPTION VALUE
??????0????12??????????(object?header) N/A
?????12?????4???char[] String.value??????????????????????????????N/A
?????16?????4??????int?String.hash N/A
?????20?????4??????????(loss due to the next object?alignment)
Instance size: 24?bytes

那么一個空字符串占用多少內存呢?我們剛才得到的是一個String對象占用了24字節,其實char[]數組還是會占用內存的,我們在上面講對象頭的時候說過,數組對象也是一個實例對象,它的對象頭比一般的對象多出來4字節,用來描述此數組的長度,所以char[]數組的對象頭長度為16字節,由于此時是空字符串,所以實例數據長度為0。因此一個空char[]數組占用內存大小為對象頭16Byte+實例數據0Byte=16Byte。一個空字符串占用內存為String對象+char[]數組對象=40Byte

那么我們上面舉的例子abcdefg占用多少內存呢?其中String對象占用的內存是不會變了,變化的是char[]數組中的內容,這里我們需要知道字符串是存放于char[]數組中的,而一個byte占用2個字節,所以abcdefg的char[]數組大小為對象頭16Byte+實例數據14Byte+對齊填充2Byte=32Byte。那么abcdefg?占用內存大小就是String對象+char[]數組對象=56Byte

用List存儲對象

那么我們在內存中放入二千萬個這個對象的話,需要占用多少內存呢?根據上面的知識我們能大概估算一下。我們定義一個List數組用于存放此對象,不讓其回收。

List animals = new?ArrayList>20000000);for?(int?i = 0; i > 20000000; i++) {
????Animal animal = new?Animal();
????animals.add(animal);
}

> 注意這里我是直接將集合的大小初始化為了二千萬的大小,所以程序在正常啟動的時候占用內存是100+MB,正常程序啟動僅僅占用30+MB的,所以多出來的60+MB正好是我們初始化的數組的大小。至于為什么要初始化大小的原因就是為了消除集合在擴容時對我們觀察結果的影響

這里我貼一張,集合未初始化大小和初始化大小內存占用對比圖,大家可以看到是有內存上的差異,在ArrayList數組中用于存放數據的是transient Object[] elementData;Object數組,所以它里面存放的是指向對象的指針,一個指針占用4個字節,所以就有兩千萬個指針,那么就是76M。我們可以看到差異圖和我們預想的一樣。

上面我們已經算出來了一個Animal對象占用16個字節,所以兩千萬個占用大概是305MB,和集合加起來就是將近380MB的空間大小,接下來我們就啟動程序來看一下我們結果是不是對的呢,接下來我用的jconsole工具查看內存占用情況。

我們可以看到和我們預算的結果是相吻合的。

那么以后如果有大量的對象需要從數據庫中查找出來放入內存的話,那么如果是使用對象來接的話,那么我們就應該盡量減少對象中的字段,因為即使你不賦值,其實他也是占用著內存的,我們接下來再舉個例子看一下對個屬性值的話占用內存是不是又高了。我們將Animal對象改造如下

class?Animal{

????private?int?age;
????private?int?age1;
????private?int?age2;
????private?int?age3;
????private?int?age4;
????
}

此時我們能夠計算得到一個Animal對象占用的內存大小是(對象頭12Byte+實例數據20Byte=32Byte)此時32由于是8的倍數所以無需進行填充補齊。那么此時如果還是二千萬條數據的話,此對象占用內存應該是610MB,加上剛才集合中指針的數據76MB,那么加起來將近占用686MB,那么預期結果是否和我們的一樣呢,我們重新啟動程序觀察,可以看到下圖。可以看到和我們分析的數據是差不多的。

用Map存儲對象

用Map存儲對象計算內存大小有些麻煩了,眾所周知Map的結構是如下圖所示。

它是一個數組加鏈表(或者紅黑樹)的結構,而數組中存放的數據是Node對象。

static?class?Node<k,v> implements?Map.Entry<k,v> {
????????final?int?hash;
????????final?K key;
????????V value;
????????Node next;
}

我們舉例定義下面一個Map對象

Mapmap

此時我們可以自己計算一下一個Node對象需要的內存大小對象頭12Byte+實例數據16Byte+對其填充4Byte=32Byte,當然這里的key和value的值還需要另算,因為Node對象此時存放的僅僅是他們的引用而已。一個Animal對象所占用內存大小我們上面也說了是16Byte,所以這里一個Node對象占用的大小為32Byte+16Byte+16Byte=64Byte。

下面我們用實際例子來驗證下我們的猜想

Mapmap?= new?HashMap>20000000);for?(int?i = 0; i > 20000000; i++) {map.put(new?Animal(),new?Animal());
}

上面的例子在一個Map對象中存放二千萬條數據,計算大概在內存中占用多少內存。

  • 數組占用內存大小:我們先來計算一下數組占了多少,這里有個小知識點,在HashMap中初始化大小是按照2的倍數來的,比如你定義了大小為60,那么系統會給你初始化大小為64。所以我們定義為二千萬,系統其實是會給我們初始化為33554432,所以此時僅僅HashMap中數組就占用了將近132MB

  • 數據占用內存大小:我們上面計算了一個Node節點占用了64Byte,那么兩千萬條數據就占用了1280MB

兩個占用內存大小相加我們可以知道大概系統中占用了1.4G內存的大小。那么事實是否是我們想象的呢?我們運行程序可以看到內存大小如圖所示。可以看到結果確實和我們猜想的一樣。

總結

回歸到上面所說的需求,幾百萬數據放到內存中會把內存撐爆嗎?這時候你可以通過自己的計算得到。最終我們那個需求經過我算出來其實占用內存量幾百兆,對于4個G的堆內存來說其實遠遠還沒達到撐爆的地步。所以有時候我們對任何東西都要存在懷疑的態度。大家可以到GitHub中下載代碼自己在本地跑一下監測一下,并且可以自己定義幾個對象然后計算看是不是和圖中的內存大小一致。這樣才能記憶更深刻。送給大家一句話從來如此,便對嗎?。其實我寫的文章里面也留了一個小坑,大家可以試著找找,是在對集合進行初始化計算那一塊。

項目源碼地址:https://github.com/modouxiansheng/Doraemon

參考

https://javaconceptoftheday.com/how-the-strings-are-stored-in-the-memory/

https://blog.csdn.net/belongtocode/article/details/103377187

精彩推薦

1、程序員喜歡的 5 款最佳代碼比較工具

2、GitHub 上有個沙雕開發者,做了款斗圖工具后火了...

3、中臺是一個營銷概念

4、如果我是面試官,我會問你 Spring 那些問題?

5、Mybatis的這些坑!把我坑慘了!

6、某小型公司持續集成工具 jenkins 實踐

7、免費版的 IDEA 為啥不能使用 Tomcat ?

8、做一個完整的Java Web項目需要掌握的技能

總結

以上是生活随笔為你收集整理的vc++64位系统下long的长度为4个字节_新来的妹子把几百万数据放入了内存,系统立马爆了...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 乱色熟女综合一区二区三区 | 动漫av在线 | 麻豆毛片 | 呦呦av| 亚洲热热 | 在线视频天堂 | 影音先锋在线看片资源 | 美女被男人插 | 国产精品igao | 911香蕉| www.成人av | 亚洲国产中文在线 | 国产精品卡一 | 九七影院在线观看免费观看电视 | 77777av| 国产一区二区啪啪啪 | 久久久久网站 | 日本大胆裸体做爰视频 | 亚洲三级在线 | 国产青青在线 | 国产一区二区三区在线观看视频 | 日本视频精品 | 男人疯狂高潮呻吟视频 | 日韩一二三四区 | 欧美一级少妇 | 黄色一级a毛片 | 久操色 | 91香蕉国产 | 夜夜爽妓女8888视频免费观看 | 中文字幕1区 | 中文字幕欲求不满 | 一区二区xxx | 久久综合影院 | 天天舔夜夜操 | 久久精品99国产国产精 | 97av在线播放 | 国产成人在线一区二区 | 网址av| 国产肥老妇视频 | 99在线免费视频 | 中国吞精videos露脸 | 亚洲精品欧美激情 | 亚洲精品成人无码毛片 | 日韩电影在线观看一区二区 | 欧美aaa在线观看 | 久久精热| 韩国19主播内部福利vip | 天堂资源中文在线 | 国产欧美一区二区精品性色99 | 亚洲第一中文字幕 | 一区二区三区国 | 三级网站在线看 | 久久免费视频网站 | 天天干在线播放 | 日韩性大片 | 免费在线观看你懂的 | 久操伊人 | 毛片在线网站 | 激情国产 | 粉色视频免费观看 | 男人天堂网在线观看 | 婷婷五月综合激情 | 91拔萝卜视频 | 日日夜夜操操 | 国产又粗又猛又爽又 | 婷婷丁香久久 | 亚洲一区二区中文字幕 | jzjzz成人免费视频 | 日韩精品视频一区二区 | 熟妇大屁股一区二区三区视频 | 床戏高潮做进去大尺度视频 | 久久久中文字幕 | 久久国内| 台湾无码一区二区 | 看全黄大色黄大片美女人 | 一级福利视频 | 亚洲欧美日韩动漫 | 韩国av免费观看 | 一本久道久久综合无码中文 | 少妇紧身牛仔裤裤啪啪 | 欧美日韩一区二区三区 | 日日干日日操 | 日本在线观看中文字幕 | 日本中文字幕网站 | 91精品国自产在线偷拍蜜桃 | 国产精品99久久久久久一二区 | 欧美在线观看视频一区二区 | 欧美高清69hd | 亚洲一级片在线播放 | 五月婷婷在线播放 | 无码h黄肉3d动漫在线观看 | 日本天堂在线播放 | 日韩欧美中出 | 中国zzji女人高潮免费 | 欧美性三级 | 日本免费三片在线播放 | www.99re7.com | www色日本| 美女大bxxxxn内射 |