Размер кучи Android и SoftReferences

У меня есть приложение, которое создает серию растровых изображений. Я держу эти растровые изображения в SoftReferences, чтобы избежать нехватки памяти. Я хотел бы, чтобы размер кучи увеличился до максимальных 16 МБ, прежде чем он начнет собирать мои SoftReferences. Тем не менее, SoftReferences собираются очень охотно, прежде чем увеличить кучу до максимума. Есть ли способ заставить ссылки собираться менее жадно? или вручную увеличить кучу до максимума? Возможно, способ просто запустить приложение с выделенным 16 МБ?


person ab11    schedule 02.12.2010    source источник


Ответы (2)


В настоящее время невозможно изменить поведение коллекции SoftReference.

Я не уверен, что вы подразумеваете под «ручным увеличением кучи до максимума».

Если это экземпляры класса Bitmap (в отличие от какой-либо пользовательской реализации растрового изображения), данные пикселей фактически хранятся в собственной куче, но используется раздражающий прием учета «внешнего распределения», который еще больше усложняет ситуацию. (Примечательно, что хранилище освобождается финализатором, а не сборщиком мусора, и финализаторы должны выполняться в отдельном потоке после завершения сборки мусора. Можно выделять растровые изображения до тех пор, пока не закончится память, и у сборщика мусора нет возможности освободить сборщик мусора. памяти перед тем, как выдать ошибку OOM.)

person fadden    schedule 03.12.2010
comment
увеличивая кучу до максимума, я надеялся найти способ принудительно выделить 16 МБ для моего приложения при запуске. что-то эквивалентное: -Xmx16m, из java. - person ab11; 03.12.2010
comment
Это ограничивает максимальный размер кучи, который в настоящее время выполняется (фреймворк приложения Android передает именно это в виртуальную машину). Вы думали -Xms16m, что бы установить начальный размер? Этот конкретный вариант не будет делать то, что вы хотите, из-за внешнего распределения. Существует скрытый метод (сначала он был случайно обнаружен, а затем спрятан) под названием dalvik.system.VMRuntime.setMinimumHeapSize, который должен был делать примерно то, что вы хотите, но это всего лишь подсказка, и в любом случае он, скорее всего, исчезнет в будущем. - person fadden; 03.12.2010

Это известная проблема в Andriod. Когда VM собирает программные ссылки, она либо собирает все, либо ничего, хотя она должна собирать «некоторые» и не должна ничего собирать, когда имеется много свободной кучи.

Проверьте: http://code-gotcha.blogspot.com/2011/09/softreference.html

person Mazed    schedule 30.09.2011