2011-12-02 80 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可确保没有收集到的对象正在增加内存使用量。