java如何實(shí)現(xiàn)打印list對(duì)象占用多大內(nèi)存
在 Java 中精確計(jì)算 List 對(duì)象占用的內(nèi)存大小需要考慮對(duì)象頭、引用、數(shù)組開銷和元素對(duì)象本身的大小。以下是幾種實(shí)現(xiàn)方式:
方法 1:使用 Java Object Layout (JOL) 工具(推薦)
JOL 是 OpenJDK 提供的官方工具,可精確分析對(duì)象內(nèi)存布局。
步驟:
添加 Maven 依賴:
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.17</version> <!-- 檢查最新版本 -->
</dependency>
打印內(nèi)存占用:
import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.info.GraphLayout;
import java.util.ArrayList;
import java.util.List;
public class ListMemorySize {
public static void main(String[] args) {
// 創(chuàng)建并填充 List
List<String> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add("Hello" + i); // 添加100個(gè)字符串
}
// 1. 打印 List 對(duì)象本身的大小(不包括元素)
System.out.println("List 對(duì)象本身大小:");
System.out.println(ClassLayout.parseInstance(list).toPrintable());
// 2. 打印整個(gè) List 結(jié)構(gòu)的總大?。òㄔ兀?
long totalSize = GraphLayout.parseInstance(list).totalSize();
System.out.println("List + 所有元素總內(nèi)存: " + totalSize + " bytes");
}
}
輸出示例:
List 對(duì)象本身大小:
ArrayList instance internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0x000012c0
12 4 int AbstractList.modCount 100
16 4 int ArrayList.size 100
20 4 Object[] ArrayList.elementData (object)
Instance size: 24 bytes
List + 所有元素總內(nèi)存: 4160 bytes
方法 2:手動(dòng)估算(僅參考)
對(duì)于 ArrayList:
1.ArrayList 對(duì)象本身:
- 對(duì)象頭:12 bytes(64位 JVM 開啟壓縮指針時(shí))
int modCount和int size:各 4 bytesObject[] elementData引用:4 bytes- 總計(jì) ≈ 24 bytes
2.底層數(shù)組 Object[]:
- 數(shù)組對(duì)象頭:16 bytes
- 數(shù)組長(zhǎng)度:4 bytes
- 每個(gè)引用:4 bytes × 數(shù)組容量(如默認(rèn)容量 10)
- 總計(jì) = 16 + 4 + (4 × capacity)
3.元素對(duì)象:
每個(gè)元素對(duì)象的實(shí)際大?。ㄈ?String 對(duì)象約 24-48 bytes)
方法 3:使用Instrumentation(需 Java Agent)
適用于需要精確計(jì)算的場(chǎng)景,但配置較復(fù)雜。
創(chuàng)建 Agent 類:
import java.lang.instrument.Instrumentation;
public class MemoryAgent {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}
在 MANIFEST.MF 中聲明:
Premain-Class: MemoryAgent
計(jì)算大小:
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 添加元素...
// 僅計(jì)算 List 本身(不包括元素)
long size = MemoryAgent.getObjectSize(list);
System.out.println("List size: " + size + " bytes");
}
}
關(guān)鍵注意事項(xiàng)
1.JVM 差異:
- 對(duì)象頭大?。ㄍǔ?8-16 bytes)
- 是否開啟壓縮指針(
-XX:+UseCompressedOops) - 內(nèi)存對(duì)齊(通常按 8 bytes 對(duì)齊)
2.包含元素:
ClassLayout只分析對(duì)象本身GraphLayout會(huì)遞歸計(jì)算所有引用對(duì)象
3.常見 List 實(shí)現(xiàn):
ArrayList:底層是數(shù)組,預(yù)分配空間可能大于實(shí)際元素?cái)?shù)LinkedList:每個(gè)元素含前后指針,開銷更大
總結(jié)建議
- 快速查看內(nèi)存:使用 JOL(
GraphLayout.parseInstance(list).totalSize()) - 生產(chǎn)環(huán)境監(jiān)控:使用 JVM 工具(如 VisualVM、JProfiler)
- 精確測(cè)量:結(jié)合
Instrumentation和 JOL
重要:Java 中對(duì)象內(nèi)存占用是近似值,不同 JVM 實(shí)現(xiàn)和垃圾回收器會(huì)導(dǎo)致結(jié)果差異。
到此這篇關(guān)于java如何實(shí)現(xiàn)打印list對(duì)象占用多大內(nèi)存的文章就介紹到這了,更多相關(guān)java打印list對(duì)象占用內(nèi)存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)自定義自旋鎖代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)自定義自旋鎖代碼實(shí)例,Java自旋鎖是一種線程同步機(jī)制,它允許線程在獲取鎖時(shí)不立即阻塞,而是通過循環(huán)不斷嘗試獲取鎖,直到成功獲取為止,自旋鎖適用于鎖競(jìng)爭(zhēng)激烈但持有鎖的時(shí)間很短的情況,需要的朋友可以參考下2023-10-10
java字符串相加時(shí)的內(nèi)存表現(xiàn)和原理分析
這篇文章主要介紹了java字符串相加時(shí)的內(nèi)存表現(xiàn)和原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Spring中的REST分頁的實(shí)現(xiàn)代碼
本文將介紹在REST API中實(shí)現(xiàn)分頁的基礎(chǔ)知識(shí)。我們將專注于使用Spring Boot和Spring Data 在Spring MVC中構(gòu)建REST分頁,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
IntelliJ IDEA遠(yuǎn)程Debug Linux的Java程序,找問題不要只會(huì)看日志了(推薦)
這篇文章主要介紹了IntelliJ IDEA遠(yuǎn)程Debug Linux的Java程序,找問題不要只會(huì)看日志了,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
基于Java編寫第一個(gè)區(qū)塊鏈項(xiàng)目
區(qū)塊鏈?zhǔn)欠植际綌?shù)據(jù)存儲(chǔ)、點(diǎn)對(duì)點(diǎn)傳輸、共識(shí)機(jī)制、加密算法等計(jì)算機(jī)技術(shù)的新型應(yīng)用模式,下面這篇文章主要給大家介紹了基于Java實(shí)現(xiàn)區(qū)塊鏈的相關(guān)資料,需要的朋友可以參考下2021-08-08
基于Java實(shí)現(xiàn)PDF文本旋轉(zhuǎn)傾斜
這篇文章主要介紹了基于Java實(shí)現(xiàn)PDF文本旋轉(zhuǎn)傾斜,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05

