检查java中BuffereImage使用了多少内存?

检查java中BuffereImage使用了多少内存?,java,memory-management,bufferedimage,Java,Memory Management,Bufferedimage,我有一个Java的BuffereImage。我如何看到它占用了多少内存? 提前感谢。我不确定是否有一种直接的方法可以解决这个问题,精确到100%的字节数,而不需要自己计算(考虑颜色模型、图像大小和其他因素) 在分配之前和之后的堆上,并以这种方式获得估计值。如果在检查之间分配(或收集)了其他对象,则计算将不准确 讨论JVM中基元类型的大小(一个对象是许多基元对象的集合),您可以使用它来解决这个问题 概述Java中的内存使用情况。您可以使用以下方法确定图像数据单独占用的字节数: DataBuffer

我有一个Java的BuffereImage。我如何看到它占用了多少内存?
提前感谢。

我不确定是否有一种直接的方法可以解决这个问题,精确到100%的字节数,而不需要自己计算(考虑颜色模型、图像大小和其他因素)

在分配之前和之后的堆上,并以这种方式获得估计值。如果在检查之间分配(或收集)了其他对象,则计算将不准确

讨论JVM中基元类型的大小(一个对象是许多基元对象的集合),您可以使用它来解决这个问题


概述Java中的内存使用情况。

您可以使用以下方法确定图像数据单独占用的字节数:

DataBuffer buff = image.getRaster().getDataBuffer();
int bytes = buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType()) / 8;
图像本身为颜色模型和其他簿记信息占用了更多的空间,但对于大型图像,
字节将是主要术语。

使用,应该能够获得非常接近的近似值。例如:

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
可确保不会收集任何对象增加内存使用量。

使用JDK(非JRE)的
bin
文件夹中的
JVisualVM
,并将Java应用程序进程附加到它。它的profiler部分可以提取应用程序中使用的所有类的内存使用情况。BuffereImage中的额外开销相对较小,特别是因为现在的大多数图像都不使用索引颜色模型(这是图像中唯一可能较大的数据块,在极少数情况下可能高达256k)。为什么最后要除以8。getDataType()是否返回以位为单位的大小?@thehanseatic-完全正确。从文档中的“返回给定数据类型标记的数据类型的大小(以位为单位)”。我自己如何计算它(颜色模型的mem使用和其他因素?)谢谢。我参考了手动计算方法,通过阅读文档,找出最终组成给定图像的原语,然后把这些值加起来。