Что такое внешняя память Dalvik? Проблемы с распределением изображений / проблема WeakHashMap - PullRequest
1 голос
/ 17 февраля 2012

Я пытаюсь написать кэш изображений.Я использую WeakHashMap, чтобы удерживать загруженные изображения и показывать их в списке ImageView.Однако через некоторое время я сталкиваюсь с:

02-17 15:13:00.416: D/dalvikvm(11766): GC_FOR_MALLOC freed 0K, 69% free 3447K/10823K, external 21870K/22699K, paused 16ms
02-17 15:13:00.455: D/dalvikvm(11766): GC_EXTERNAL_ALLOC freed <1K, 69% free 3447K/10823K, external 21870K/22699K, paused 25ms
02-17 15:13:00.463: E/dalvikvm-heap(11766): 116160-byte external allocation too large for this process.
02-17 15:13:00.490: E/GraphicsJNI(11766): VM won't let us allocate 116160 bytes

После чего я получаю OutOfMemoryError.

Очевидно, что у меня заканчивается "внешняя память", что бы это ни было.Доступно много кучи, но это не имеет значения.Похоже, что GC не может очистить эту «внешнюю память», хотя единственные ссылки, которые у меня есть, - это слабый хэш и imageViews в списке (который должен быть только одним экземпляром, повторно использованным) ...

Может кто-нибудь помочь мне пролить свет на этот вопрос?Что это за внешняя память, из которой у меня заканчивается?Почему GC не очищает старые изображения?

Редактировать: я с тех пор узнал, что вызвало освобождение моей памяти: WeakHashmap выпускает записи, когда на KEYS больше нет ссылок, а не когдаЦЕННОСТИ не являются ссылками.Мой главный вопрос все еще остается: что это за внешняя память?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2012

Проблема в том, что вы пытаетесь выделить больше памяти, чем доступно. Даже если у вас есть 60% свободного места, если вы попытаетесь выделить что-то 61% размера кучи, вы получите сообщение об ошибке «Недостаточно памяти».

0 голосов
/ 17 февраля 2012

Я считаю, что базовый андроид имеет 16 МБ динамической памяти, которая используется для всех объектов программы, включая вашу хэш-карту, поэтому вам не нужно много памяти.Некоторые отдельные устройства с настроенным ПЗУ могут иметь больше места, но по умолчанию составляет 16 МБ.На самом деле он закодирован в самом Android, а именно в файле frameworks/base/core/jni/AndroidRuntime.cpp:

AndroidRuntime::startVm()
...
strcpy(heapsizeOptsBuf, "-Xmx");
property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m");
//LOGI("Heap size: %s", heapsizeOptsBuf);
opt.optionString = heapsizeOptsBuf;
mOptions.add(opt);

. Вы можете использовать метод recycle() и некоторые другие методы, чтобы минимизировать использование памяти приложением, но если вам нужнохраните более 16 МБ данных, и вам не повезло.

...