JVM對象占用內存計算

大家都知道,jvm中對象實例存儲在堆中,對象的引用存儲在棧中,而對象的元數據(類型數據)存儲在方法區。在我們進行內存優化的過程中經常需要了解每個對象占用的內存大小。接下來我將介紹對象占用內存大小的計算方式。

Java的對象模型

java是面向對象的語言,每個對象都屬于某個類。在HotSpot虛擬機中對象采用的是oop-klass模型。其實原理很簡單:就是在方法區中生成一個Class類保存類信息(Klass),包含靜態常量、靜態方法、字節碼、即時編譯代碼等元數據,而在堆中實例化該類的實例對象(oop),實例對象中保存了指向Class類的指針,這樣便構成了oop-klass模型。這樣做有一個好處就是:在實現多態時只需要在Class類中保存虛方法表來減少頻繁的方法搜索,而實例對象無需保存虛方法表。

每個對象都有一個 mark work 頭部,以及一個引用(klass pointer)指向Class類的信息。

  1. 在未開啟 UseCompressedOops 的 64 位 JVM 上,對象頭有 16 字節大小,即 8 字節的 mark word 和 8 字節的引用。
  2. 在開啟 UseCompressedOops 的 64 位機器上,引用成了 4 字節,一共 12 字節。

java對象在內存中模型如下:
java對象內存模型(其中粉色和綠色區域并不代表實際內存)

Java對象內存占用

對象大小分為:

  1. 自身的大小(Shadow heap size)
  2. 所引用對象的大小(Retained heap size)
class MyClass {int a;Object object;
}

如上圖例子所示:myClass 實例創建出來之后,在內存中所占的大小就是 myClass 自身大小(Shadow heap size)。包括類的頭部大小以及一個int的大小和一個引用的大小。myClass 中object 成員變量是一個對象引用,這個被引用的對象也占一定大小。myClass 實例所維護的引用的對象所占的大小,稱為myClass實例的Retained heap size。我們這里僅討論如何計算對象自身的大小,引用對象大小的計算方式可依此類推。

java對象內存可分為:頭部 + 數據 + 對齊字節
±-----------------±-----------------±----------------- ±--------------+
| mark word | klass pointer | data (opt) | padding |
±-----------------±-----------------±------------------±--------------+

(1)頭部大小(mark word + klass pointer)

  1. 在未開啟 UseCompressedOops 的 64 位 JVM 上,對象頭有 16 字節大小,即 8 字節的 mark word 和8 字節的引用。
  2. 在開啟 UseCompressedOops 的 64 位機器上,引用成了 4 字節,一共 12 字節。

(2)數據大小(data)
空對象不包含任何成員變量,其大小即對象頭大小。若存在成員成員,為了內存緊湊,成員在內存中的排列和聲明的順序可能不一致,這樣才能充分利用內存空間。這是因為在32位系統中,對象大小需要為4byte(32位)的整數倍,而在64位的系統中,對象需要為8byte(64位)的整數倍。如下例子:

class MyClass {byte a;int c;boolean d;long e;Object f;        
}

其內存布局為:
![在這里插入圖片描述](https://img-blog.csdnimg.cn/20191105222832371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE
值得一提的是,數組對象和普通對象存在一點小區別:數組多一個記錄數組長度的 int 類型(4byte

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450988.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

繪圖基礎語法與常用參數

1 # -*- coding: utf-8 -*-2 3 ###############################################################################4 ####################### 正文代碼 #######################5 #################################################################…

MyEclipse 皮膚、主題、背景色

第一步:打開myeclipse--->help--->install from site--->Add將路徑粘貼在這里。等待安裝顏色主題。https://raw.github.com/guari/eclipse-ui-theme/master/com.github.eclipseuitheme.themes.updatesite 第二步:http://eclipsecolorthemes.org…

RPC 遠程過程調用協議

RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。 RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜…

周鴻祎:創業前的積累很重要

摘要:雖然公司上市,也投資了很多公司,日前,在中國人民大學的演講中,周鴻祎卻稱自己“從來不是一個成功人士,曾經是一個最大的失敗者”。 360特供機還沒露面,已經被周鴻祎通過微博炒得火熱&#…

BZOJ 4710 [Jsoi2011]分特產 解題報告

4710 [Jsoi2011]分特產 題意 給定\(n\)個集合,每個集合有相同的\(a_i\)個元素,不同的集合的元素不同。將所有的元素分給\(m\)個不同位置,要求每個位置至少有一個元素,求分配方案數。 先考慮兩個簡單的問題 給定\(m\)個相同元素和\…

java接口調試思想

對于接口調試的理解:最近多次參與接口調試工作,一般情況都是獲取對方接口文檔,文檔中有加密驗證方式,根據加密驗證方式開發,調用對應的接口。可以不可以簡化這個流程那,至少減少一方的工作量。1、減少調用方…

SOA (面向服務的架構)

見:https://baike.baidu.com/item/SOA/2140650?fraladdin UDDI 解說參見:UDDI是什么 SOAP解說參見: SOAP:簡單對象訪問協議 面向服務的架構(SOA)是一個組件模型,它將應用程序的不同功能單元(稱…

mysql中count(*)和count(1)和count(column)區別

在日常的mysql使用中,我們經常會看到SELECT COUNT(*)、SELECT COUNT(1)等查詢語句,他們到底有什么區別呢?今天我就來總結下。 我們先從函數的含義說起: count() 統計滿足查詢條件的結果集的總行數(包含null),其中count…

第一天筆記

編程語言分類: 1. 機器語言:用二進制指令編程,本質是直接操作硬件。 優點:執行效率高 缺點:開發效率低,學習難度高 2.匯編語言:用英文標簽代替二進制指令,本質也是直接操作硬件。…

索尼MOTO等壓榨國內代工廠:員工宿舍像監獄

摘要:據調查報告披露,偉易達血汗工廠的壓榨情況比起富士康、蘋果等有過之而無不及,包括強迫工人超負荷工作、暴露于有害化學物質、住宿環境差、虐待員工、超低的工資等。如前面保羅克魯格曼發表了《表揚廉價勞動》一文,N.D.克里斯…

[cerc2012][Gym100624B]20181013

轉載于:https://www.cnblogs.com/KonjakJuruo/p/9809637.html

Nginx服務器證書部署-亞洲誠信

Nginx服務器證書部署發布時間:2018-01-17 16:15:25依賴建議l SSL卸載驅動。建議:openssl版本1.1.0f。l nginx版本Stable version:最新穩定版,生產環境上建議使用的版本。獲取證書MPKI方式:1. 登錄https://mpki.tru…

java transient關鍵字

transient是用在序列化中的。當我們序列化的過程中,如果我們不想序列化某個字段,那么我們就可以使用這個關鍵字,jvm就會在序列化的時候自動忽略這個字段的數值。 transient主要有兩個用途: 1.保證數據的安全。在進行序列化時&…

UDDI

見:https://baike.baidu.com/item/UDDI/2901586?fraladdin UDDI 是一種目錄服務,企業可以使用它對 Web services 進行注冊和搜索。UDDI,英文為 "Universal Description, Discovery and Integration",可譯為“通用描述、…

騰訊手機管家籌劃“出海”

摘要:正籌劃推進旗下手機安全產品出海攬客。6月22日,騰訊無線安全產品部副總經理胡振東在上海表示,騰訊手機管家已推出了安卓國際版,下決心進軍國際市場。 騰訊(00700.HK)正籌劃推進旗下手機安全產品出海攬客。6月22日&#xff0c…

用反卷積(Deconvnet)可視化理解卷積神經網絡還有使用tensorboard

『cs231n』卷積神經網絡的可視化與進一步理解 深度學習小白——卷積神經網絡可視化(二) TensorBoard--TensorFlow可視化 原文地址:http://blog.csdn.net/hjimce/article/details/50544370 作者:hjimce 一、相關理論 本篇博文主要講…

java線程實現及線程池的使用

Java線程實現 線程把處理器的調度和資源分配分開,是cpu的最小調度單位。多個線程可以共享進程的內存資源,又可以獨立調度。java線程關鍵方法都是通過高效的本地方法實現的。Java線程的主要實現方式有三種:內核實現、用戶實現、內核用戶混合實…

SOAP:簡單對象訪問協議

見:https://baike.baidu.com/item/%E7%AE%80%E5%8D%95%E5%AF%B9%E8%B1%A1%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE/3841505?fraladdin&fromid4684413&fromtitleSOAP 簡單對象訪問協議 SOAP(簡單對象訪問協議)一般指簡單對象訪問協議 …

程序調試

對拍 $ Windows $ 下的對拍程序 借助 \(Windows\) 腳本echo off :loop r.exe > input.in coronas.exe <input.in > output.a std.exe <input.in > output.b fc output.a output.b if not errorlevel 1 goto loop 一直沒有找到怎樣能控制對拍次數,今天終于醒悟,可…

不怕燒錢怕翻車:雷軍與馬化騰現場“過招”

說起微信&#xff0c;很多時尚潮人都很熟悉。這款軟件可以發送語音信息、可以在有無線網絡的地方免費發送、甚至只需搖一搖就能找到在你附近的用戶&#xff0c;這些方便、時尚、新穎的元素使微信受到了很多用戶的喜愛&#xff0c;也奪得了大量的市場。其實&#xff0c;在微信發…