Intereting Posts
Отладка приложения Android на телефоне Удалите все строки таблицы из таблицы базы данных SQLite Есть ли карта Android PCI? Загрузка полной трансляции, обработанной последовательно в KITKAT 4.4.2 <ACTION_BOOT_COMPLETED> <ActivityManagerService.java> Лучший вариант использования API-интерфейсов GData на Android? Моя служба всегда получает Waited достаточно долго для: Ошибка ServiceRecord в Kitkat Поиск местоположений в определенном городе в Google Местах Apis Формат файла Android NinePatch .png? Android, как изменить интервал TimerTask после shcedule? Следующие классы не могли быть созданы: – android.support.v7.widget.Toolbar Эмулятор студии Android не запускается с сообщением об ошибке ограничения памяти Примените смещение к элементам GridLayout и сохраните равный размер среди всех элементов Как сделать ход для 3 сторон для формы в андроиде? Другое действие появляется и покрывает половину размера экрана Как создать экран слайдера (как в Tweetdeck) в Android?

Android Понимание размеров кучи

Я довольно новичок в разработке Android, и, похоже, я не понимаю исключения Java Out of Memory. Я знаю, это означает, что мое приложение перешло на бюджет VM, но после Googling это много раз, я все еще не понимаю эту концепцию. Я боюсь, что мое приложение использует слишком много памяти, потому что у меня есть шесть переключателей на один экран с двумя растровыми изображениями для каждого селектора, каждый из которых по 20 кб по каждой вкладке свойств. На моем корневом G2x я установил бюджет VM на 12mb, перезапустил свой телефон и без проблем запускал мое приложение. Я развязываю чертежи по каждому из них (и) и намекает на GC, чтобы работать здесь также. После использования приложения некоторое время в эмуляторе я нажимаю «Причина GC» на моем экране DDMS, и результаты ID = 1, размер кучи 6.133 МБ, выделены 2.895MB, бесплатно 3.238 MB,% Используется 47.20, # Объекты 52,623.

Вот где я не понимаю, что происходит, мой эмулятор настроен на 24 МБ виртуальной машины. Где этот номер? Фактическая проблема, с которой я сталкиваюсь, заключается в том, что если я настрою эмулятор на 16 МБ виртуальной машины, мое приложение выйдет из строя во втором действии с исключением Out of Memory. Почему это не сбой на моем телефоне с установленной VM до 12 МБ или на моем старом телефоне HTC Magic с 12 МБ акций VM? И вы, ребята, думаете, что мое приложение занимает слишком много памяти? Я не знаю, хороши ли эти номера DDMS или нет. Спасибо за ваше время.

Что касается моего кода, у меня есть все изображения, указанные в XML-макетах, я ничего не делаю с ними программно, кроме как добавлять к ним слушателей. Здесь я нашел этот фрагмент кода, и я добавил его к каждому действию, которое у меня есть …

@Override protected void onDestroy() { super.onDestroy(); unbindDrawables(findViewById(R.id.myRootLayout)); System.gc(); } private void unbindDrawables(View view) { if (view.getBackground() != null) { view.getBackground().setCallback(null); } if (view instanceof ViewGroup && !(view instanceof AdapterView)) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { unbindDrawables(((ViewGroup) view).getChildAt(i)); } ((ViewGroup) view).removeAllViews(); } } 

В противном случае все, что я делаю, добавляет onClickListeners к кнопкам с фонов PNG. Я хотел бы узнать, как программировать фоновые кнопки кнопок, но мне нужно иметь функции селектора, такие как фокус, нажатие, не сфокусированное, но нажатие и т. Д., Чтобы изменить фоны кнопок в соответствии с взаимодействием пользователя. Я просмотрел документы об этом, но это кажется ошеломляющим, поэтому я решил, что начну с основ управления Heaps и проделаю свой путь до определения селекторов в коде. Это может не иметь смысла, но есть ли «полезный» объем распределения памяти, который приложение может выделять, не приблизившись к исключению Out of Memory? Например, если приложение выделяет 6 МБ, оно должно быть прекрасным, но 8 МБ будет его подталкивать, существуют ли ограничения в распределении памяти? Еще раз спасибо Алекс Локвуд за ваш ответ. Я собираюсь прочитать и перечитать его снова, пока этот материал не будет иметь для меня смысла.

Solutions Collecting From Web of "Android Понимание размеров кучи"

Когда вы устанавливаете бюджет VM на своем эмуляторе / устройстве, то, что вы делаете, говорит куче максимальный размер, который это разрешено. Во время выполнения куча растет динамически по размеру, так как Dalvik VM запрашивает системную память из операционной системы. VM Dalvik обычно начинается с выделения относительно небольшой кучи. Затем после каждого запуска GC он проверяет, сколько свободной памяти кучи есть. Если отношение свободной кучи к общей куче слишком мал, тогда Dalvik VM добавит больше памяти в кучу (до максимального размера установленной кучи).

При этом причина, по которой вы не видите «24 МБ» на экране DDMS, состоит в том, что куча не достигла максимального размера. Это позволяет Android хорошо использовать уже небольшой объем памяти, доступный на карманных устройствах.

Что касается того, почему ваше приложение рушится на эмуляторе, а не на вашем телефоне, это кажется странным (вы уверены, что цифры верны?). Однако вам следует иметь в виду, что память управляется динамически и что общий объем использования памяти определяется на основе ряда внешних факторов (скорость / частота, с которой выполняется сбор мусора и т. Д.).

Наконец, по причинам, о которых я говорил выше, было бы трудно сказать, насколько хорошо ваше приложение управляет памятью на основе одной строки информации, которую вы указали выше. Нам действительно нужно увидеть некоторые из вашего кода. OutOfMemoryError s, безусловно, стоит беспокоиться о том, что я обязательно посмотрю на использование памяти вашего приложения. Одна вещь, которую вы можете рассмотреть, – это образец изображений растровых изображений во время выполнения с вызовами inSampleSize с использованием класса BitmapFactory . Это может помочь уменьшить объем памяти, необходимый для загрузки ваших рисованных растровых изображений. Либо это, либо вы могли бы уменьшить разрешение ваших рисунков (хотя для каждого из них было хорошо, по 20 kb).

Даже если ваше приложение не достигло предела «24 МБ» (варьируется в пределах устройств), вы все равно можете столкнуться с сбоями, потому что Android занимает некоторое время, чтобы увеличить кучу пространства для вашего приложения.

В моей ситуации я создавал и сбрасывал несколько изображений за небольшое количество времени.

Довольно часто я получал OutOfMemoryError .

Кажется, Android не был достаточно быстрым, чтобы увеличить кучу пространства для моего приложения.

Я считаю, что я решил эту проблему, используя параметр largeHeap в файле манифеста. При этом настройке Android оставляет больше свободной памяти каждый раз, когда она вырастает в куче, сводя к минимуму вероятность поражения текущего предела.

Я не использую ограничение 24 Мб, но этот largeHeap конф был весьма удобен.

Вам просто нужно установить largeHeap="true" в теге приложения вашего AndroidManifest.xml

 <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:largeHeap="true" android:theme="@style/AppTheme" > 

Тем не менее, следите за тем, чтобы вы обращали внимание на изображения, например, @Alex Lockwood.