Ошибки нехватки памяти происходят с большим размером кучи, но с низким выделенным размером. Зачем? - PullRequest
6 голосов
/ 23 апреля 2011

У меня довольно трудоемкий процесс, который может привести к тому, что размер кучи увеличится до своего предела (например, 24 в этом случае).

Однако, когда этот процесс заканчивается, и выделенная память (как указано в инструменте кучи DDMS и в дампе кучи) становится намного ниже, как 6 или 7.

Несмотря на то, что выделенной памяти мало, а свободной памяти много, куча, похоже, не возвращается.

Таким образом, даже несмотря на то, что в нем достаточно памяти, в этом случае я все равно могу получить ошибки памяти.

Так что напрашивается пара вопросов:

  1. Несмотря на то, что выделенная память на вкладке «Кучи» в DDMS и самих дампах кучи показывает только 7 МБ памяти в качестве выделенной, есть ли скрытая память, которая не упоминается и не собирается сборщиком мусора? Если да, то как мне это отследить?

  2. Кажется, ошибки нехватки памяти основаны на размере кучи, а не на выделенном объеме памяти. Так есть ли способ заставить размер кучи уменьшиться, когда он не должен быть таким большим, когда процесс интенсивной памяти закончен?

Спасибо за ваши идеи.

Ответы [ 3 ]

13 голосов
/ 23 апреля 2011

Недостаточно памяти возникает, когда вы пытаетесь использовать больше памяти, чем максимально допустимый размер кучи. Однако обратите внимание, что Android GC в настоящее время не дефрагментирует кучу, и кажется, что это проблема, с которой вы столкнулись. Ваша куча может иметь много доступной памяти, но фрагментирована небольшими порциями. Если виртуальная машина не может найти достаточно большой кусок для выделения, которое вы пытаетесь выполнить, произойдет OOME.

1 голос
/ 23 апреля 2011

Вы пытались зайти в System.gc ()?

Если вы работаете с растровыми изображениями, вы можете посмотреть на это: http://davidjhinson.wordpress.com/2010/05/19/scarce-commodities-google-android-memory-and-bitmaps/

0 голосов
/ 09 апреля 2013

Для Android 3.2 (API 13) и выше, это может помочь добавить android: configChanges = "direction | screenSize" в ваш манифест, если у вас есть большие растровые изображения, которым требуется "match_parent" из layout-порта и xml-файлы layout-land.

...