我有一个相当内存密集的进程,可能导致堆大小增长接近其限制(在本例中为24)。
但是,当该过程结束时,分配的内存(在DDMS堆工具和堆转储中列出)远远低于6或7。
尽管分配的内存很少,并且有大量的可用内存,但堆似乎没有回来。
所以尽管它说有足够的可用内存,但在这种情况下我仍然会出现内存错误。
所以它引出了几个问题:
即使DDMS的Heap选项卡中的Allocated内存和堆转储本身只显示分配的7mb内存,还有未提及的未被垃圾收集的隐藏内存?如果是这样,我该如何追踪?
似乎内存不足错误是基于堆大小,而不是分配内存大小。那么当内存密集型进程结束时,如果不需要那么高的话,是否有办法强制堆大小恢复?
感谢您的见解。
答案 0 :(得分:13)
当您尝试使用的内存超过允许的最大堆大小时,会发生内存不足。但请注意,Android的GC目前不会对堆进行碎片整理,这似乎是您遇到的问题。您的堆可能有大量可用内存,但在小块中碎片化。如果VM无法找到足够大的分配块,那么你会尝试这样做,OOME就会发生。
答案 1 :(得分:1)
你试过弹出System.gc()吗?
如果您正在使用位图,可能需要查看以下内容:http://davidjhinson.wordpress.com/2010/05/19/scarce-commodities-google-android-memory-and-bitmaps/
答案 2 :(得分:-2)
对于Android 3.2(API 13)及更高版本,如果您的布局中需要“match_parent”的大位图,则可能有助于将 android:configChanges =“orientation | screenSize”添加到您的清单中port和layout-land xml文件。