我正在分析我的程序的内存使用情况,并且我意识到它使用了50 MB的内存......它可能需要它的全部内容? (程序相当简单,它不是hello world,但它只有937个非空白行)。所以我把它放入jhat,我得到了很多信息,没有任何关于所有这些Integer,Character和Byte数组的引用的信息。
这是显示最大记忆力的图像:
当您点击class[I
时,会出现很多类似的内容:
在近5000个实例计数中,大部分内存使用量都在最大的22个阵列中(我认为使用excel),其中15个的大小为2677104.而且它们似乎是几乎完全为零的数组,如所见这里:
rootset中的引用链没有提供任何内容。点击“从这里可以到达的对象”并没有给出任何有用的东西,我想:
什么是使用这个记忆?我使用以下库:netty 3.6.5,mbassador 1.1.7,guice 3.0,guava 14.0.1,logback 1.0.11,joda-time 2.1,gson 2.2.3。
更新:我将完全相同的堆转储运行到Eclipse MAT中并获得了不同的结果......
我想知道那些大型数组是否已安排用于GC而MAT正在过滤掉它们?也许我过早地分析我的程序......“大约97%的时间:过早优化是所有邪恶的根源” - Donald Knuth