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

java如何實(shí)現(xiàn)打印list對(duì)象占用多大內(nèi)存

 更新時(shí)間:2025年07月18日 08:56:19   作者:慧一居士  
在 Java 中精確計(jì)算 List 對(duì)象占用的內(nèi)存大小需要考慮對(duì)象頭,引用,數(shù)組開銷和元素對(duì)象本身的大小,下面小編就來和大家詳細(xì)介紹一下具體實(shí)現(xiàn)方式吧

在 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 modCountint size:各 4 bytes
  • Object[] 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)存:使用 JOLGraphLayout.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?Spring的兩種事務(wù)你知道嗎

    Java?Spring的兩種事務(wù)你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java?Spring的兩種事務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 詳解Java中Method的Invoke方法

    詳解Java中Method的Invoke方法

    這篇文章主要介紹了詳解Java中Method的Invoke方法,需要的朋友可以參考下
    2017-10-10
  • 基于SpringMVC入門案例及講解

    基于SpringMVC入門案例及講解

    這篇文章主要介紹了基于SpringMVC入門案例及講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java實(shí)現(xiàn)自定義自旋鎖代碼實(shí)例

    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)和原理分析

    這篇文章主要介紹了java字符串相加時(shí)的內(nèi)存表現(xiàn)和原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring中的REST分頁的實(shí)現(xiàn)代碼

    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ì)看日志了(推薦)

    這篇文章主要介紹了IntelliJ IDEA遠(yuǎn)程Debug Linux的Java程序,找問題不要只會(huì)看日志了,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 基于Java編寫第一個(gè)區(qū)塊鏈項(xiàng)目

    基于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)傾斜

    這篇文章主要介紹了基于Java實(shí)現(xiàn)PDF文本旋轉(zhuǎn)傾斜,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java中volatile防止指令重排

    Java中volatile防止指令重排

    volatile可以防止指令重排,在多線程環(huán)境下有時(shí)候我們需要使用volatile來防止指令重排,來保證代碼運(yùn)行后數(shù)據(jù)的準(zhǔn)確性,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論