我在Java中有一个bufferedImage。我怎么看它占用了多少内存? 提前谢谢。
答案 0 :(得分:13)
您可以使用此确定图像数据单独占用的字节数:
DataBuffer buff = image.getRaster().getDataBuffer();
int bytes = buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType()) / 8;
图像本身为颜色模型和其他簿记信息占用了更多空间,但对于大图像,bytes
将成为主导词。
答案 1 :(得分:0)
我不确定有没有一种直接的方法来解决这个问题,只需要100%的准确度到字节数,而不用自己计算(考虑到颜色模型,图像大小和其他因素) )。
在分配之前和之后的堆上You can calculate the totalMemory() and freeMemory(),并以此方式获得估计。如果在您的支票之间分配(或收集)其他对象,则您的计算将不准确。
This discussion讨论了JVM中原始类型的大小(一个对象是许多原始对象的集合),您可以用它来解决这个问题。
This article概述了Java中的内存使用情况。
答案 2 :(得分:0)
使用Runtime#totalMemory
和Runtime#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
可确保没有收集的对象正在添加内存使用情况。