簡體   English   中英

如何確定我的課程使用多少內存?

[英]How can I determine how much memory my classes use?

我與我的計算機科學老師討論了JAVA課程的內存占用量。 我們倆都不知道具體的答案,但我有一些他無法回答的問題。

1)它的原始數據類型使用的每個類的字節數是否與確定其內存使用情況一樣簡單?

2)如果你創建一個類的實例並將其設置為null,它是否仍然占用與非空的實例一樣多的字節?

3)包含100個字符的字符串是否與單個字符串具有相同的字節數?

4)如果一個類沒有變量,沒有方法,沒有,只是看起來像這樣:

public class Test{}

還會占用記憶嗎?

你在兩個不同的東西之間混淆:一個class占用的內存量(元數據,或實例的“藍圖”)和instance占用的內存量(數據/對象)。

對於類,您可以使用java.lang.instrument.Instrument.getObjectSize(yourObject.getClass()); 而對於一個實例 - 它不一定具有固定的大小。 例如,如果您有一個Person實例並且它有一個name字段 - 那么不同的名稱將根據String的長度捕獲不同的空間。

您可以使用分析器來查看內存實例占用的內容, YourKit是一個優秀的分析器,但它不是免費的。

使用此: java.lang.instrument包

編譯該庫並包含在jar中。 然后:

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    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: ObjectSizeFetcher

現在做:

public class C {
    private int x;
    private int y;

    public static void main(String [] args) {
        System.out.println(ObjectSizeFetcher.getObjectSize(new Test()));
    }
}

您可以使用以下命令調用代碼:

java -javaagent:ObjectSizeFetcherAgent.jar C

source: 在Java中,確定對象大小的最佳方法是什么?

您可以使用此處的技術測量尺寸:

https://stackoverflow.com/a/383597/3049628

除此之外,您通常可以猜測大量的內存(大多數事情是4個字節或8個,具體取決於32位或64位系統。數組打包得更好。)但實際實現依賴於JVM,所以沒有固定的規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM