2013-11-01 5 views
2

В настоящее время я разрабатываю приложение для Android, и я использую свое собственное устройство (nexus 4) для его отладки. Кажется, у меня проблемы с размером кучи, выделенными Dalvik VM, и я надеюсь, что вы можете мне помочь в этом.На dalvik initial heapsize

Мое приложение обрабатывает относительно важный объем данных (~ 3 МБ) из файла и использует его для генерации объектов Java, которые охватывают всего 10 МБ. Это не должно быть проблемой для устройства с 2 ГБ ОЗУ и ограничения размера кучи 512 МБ (если я не ошибаюсь).

Однако инструмент отладки говорит мне, что размер кучи, выделенный моему приложению, составляет примерно 10 МБ, что приводит к возмутительному объему сбора мусора (каждый GC frees ~ 500KB). Я просмотрел уже много страниц на SO и других форумах о модели размера кучи Dalvik и т. Д., И я нашел атрибут (API level 13+) для использования в этом случае, однако он ничего не улучшил, и я все еще застрял с 10 МБ для использования, когда устройство имеет начальную память 2 ГБ. Я понимаю, что ОС и т. Д. И т. Д. Берут некоторую память, что Dalvik также ограничивает приложения, но почему я не могу достичь хотя бы 512 МБ?

Итак, я что-то не понял? Я что-то пропустил? Проблема кажется довольно простой, но я не понимаю.

Ваша помощь будет принята с благодарностью!

PS: Пожалуйста, не предлагайте переключиться на NDK, это не подходит в моем случае.

ответ

5

Если вы не получаете OutOfMemoryError, изменение размера кучи не повлияет на поведение.

Управляемая куча Dalvik сопротивляется росту, пытаясь свести к минимуму объем памяти приложения и, к сожалению, иногда «зависает» на определенном размере. Как правило, можно объединить вокруг этого, выделив большой объект (скажем, byte[1000000]) и сразу же опустив ссылку на него.

FWIW, лучший способ гарантировать, что ссылка отбрасывается, заключается в том, чтобы выделить ее в методе, который немедленно возвращается. Не просто обнулите ссылку. Далвик GC не является живым, поэтому он не будет игнорировать «мертвые» ссылки, задерживающиеся в реестрах.

(Все вышеперечисленное для Android 4.4 и выше. Будем надеяться, что ситуация улучшится в будущих версиях.)

+0

Здравствуйте, прежде всего, спасибо за ваш ответ. Идея обмануть виртуальную машину хороша. Не чистое решение, а план резервного копирования. Мой вопрос был более портирован на числах на самом деле. Мое приложение использует больше данных, чем среднее приложение, и все же ему выделяется только 10 МБ, что кажется очень низким по сравнению с тем, что получают другие приложения (64 МБ +). –

+0

У вашего приложения будет доступ к тому же количеству, которое получат другие приложения. VM просто пытается очень не использовать его. В идеале VM увидит, что это GCing часто и расширяет кучу, а не настаивает на том, чтобы держать кучу маленькой, но в настоящее время она этого не делает. – fadden

+0

«fiat lux» :) Большое спасибо за объяснение, все сразу стало ясно! –

Смежные вопросы