2011-12-02 75 views
8

我在Java中有一個bufferedImage。我如何看到它佔用了多少內存? 在此先感謝。檢查java中使用了多少內存bufferedImage?

+0

使用'JVisualVM'在JDK(不是JRE)的'bin'文件夾,您的Java應用程序的進程連接到它。其配置文件部分可以提取應用程序中使用的所有類的內存使用情況。 –

回答

12

您可以確定有多少字節的圖像數據單獨使用這種佔用:

DataBuffer buff = image.getRaster().getDataBuffer(); 
int bytes = buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType())/8; 

圖像本身佔用了更多的空間用於顏色模型和其他簿記信息,但對於大的圖像,bytes將成爲主導詞。

+0

+1絕對是一個聰明的做法。 BufferedImage中的額外開銷相對較小,特別是因爲現在大多數圖像不使用索引顏色模型(這是圖像中唯一的其他潛在的大數據塊,在極少數情況下可能高達256k)。 – mikera

+0

爲什麼你在最後除以8。 getDataType()返回大小的位數? – klyngbaek

+0

@thehanseatic - 的確如此。從文檔爲[DataBuffer中](http://docs.oracle.com/javase/6/docs/api/java/awt/image/DataBuffer.html):_「返回數據類型的大小(位) ,給定一個數據類型標籤。「_ –

0

我不知道有100%的準確率下降到字節數算出這個一個直接的方式,沒有自己計算它(考慮到顏色模式,圖像尺寸,以及其他因素)。

在分配之前和之後的堆You can calculate the totalMemory() and freeMemory(),並得到一個估算的方式。如果其他對象在您的支票之間分配(或收集),您的計算將不準確。

This discussion討論了JVM中原始類型的大小(一個對象是許多原始對象的集合),您可以使用它來計算出這些。

This article給Java中的內存使用情況的概述。

+0

我將如何去計算它自己(顏色模型和其他因素的mem使用情況?)謝謝。 – klyngbaek

+0

我參考了手動計算方法,通過閱讀文檔,找出最終組成給定圖像的基元,然後將這些值相加。 – jefflunt

0

使用Runtime#totalMemoryRuntime#gc應該能夠讓你非常接近。例如:

Runtime.getRuntime().gc();Runtime.getRuntime().gc();Runtime.getRuntime().gc(); 
long totalUsed = Runtime.getRuntime().totalMemory(); 

BufferedImage image = ... 

Runtime.getRuntime().gc();Runtime.getRuntime().gc();Runtime.getRuntime().gc(); 
totalUsed = Runtime.getRuntime().totalMemory() - total; 

調用gc多次增加了垃圾收集器會實際運行的機會,因爲gc只是一個建議。在本例中調用gc可確保沒有收集到的對象正在增加內存使用量。