高堆大小但分配大小较低时会发生内存不足错误.为什么?

cot*_*aws 6 memory heap android

我有一个相当内存密集的进程,可能导致堆大小增长接近其限制(在这种情况下为24).

但是,当该过程结束时,分配的内存(在DDMS堆工具和堆转储中列出)远远低于6或7.

尽管分配的内存很低,而且有大量的可用内存,但堆似乎没有回来.

因此即使它说有足够的可用内存,我仍然可以在这种情况下出现内存错误.

所以它引出了几个问题:

  1. 即使DDMS的Heap选项卡中的Allocated内存和堆转储本身只显示分配的7mb内存,还有未提及的未被垃圾收集的隐藏内存?如果是这样,我该如何追踪?

  2. 似乎内存不足错误是基于堆大小,而不是分配内存大小.那么,当内存密集型进程结束时,如果不需要那么高,有没有办法强制堆大小恢复?

感谢您的见解.

Rom*_*Guy 13

当您尝试使用比允许的最大堆大小更多的内存时,会发生内存不足.但请注意,Android的GC目前不会对堆进行碎片整理,这似乎是您遇到的问题.您的堆可能有大量可用内存,但在小块中碎片化.如果VM无法找到足够大的分配块,那么你会尝试做,OOME就会发生.