Які переваги встановлення великої довіри до істини?


122

У мене є додаток з майже 50 класами, які я встановлюю android:largeHeap="true", як видно нижче. Це хороша практика?

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="Mall"
        android:largeHeap="true"
        android:logo="@drawable/logo_for_up"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" >
</application>

Просимо запропонувати переваги та недоліки його використання.

У мене виникають проблеми з пам'яттю, тому я задаю це питання.


якщо вам потрібна велика пам’ять для вашого додатка, як ігри 3dмоделі тощо
januprasad

47
50 класів не так вже й багато.
Кріс Хейс


якщо ви використовуєте якусь службу чи будь-які інші додатки всередині вашого додатка, які споживають пам'ять, то у вашому додатку виникне проблема пам'яті, наприклад, камера - це найпоширеніша особа розробника проблеми під час використання додатка або якщо у вас багато змінних, які споживають пам'ять або статичні змінна також може бути причиною цього.
Адіті

4
Кількість занять не важлива. Що зазвичай займає багато пам'яті, це растрові карти. Див. " Завантаження зменшеної версії в пам'ять ".
ToolmakerSteve

Відповіді:


116

Шлях занадто пізно для вечірки тут, але я запропоную свої 0,02 $ у будь-якому випадку.
Тут не дуже добре використовувати android:largeHeap="true" витяг з google, який пояснює це,

Однак можливість запитувати велику купу призначена лише для невеликого набору програм, які можуть виправдати необхідність споживати більше оперативної пам’яті (наприклад, великий додаток для редагування фотографій). Ніколи не вимагайте великої купи просто тому, що у вас не вистачає пам’яті, і вам потрібно швидко виправити - використовувати її потрібно лише тоді, коли ви точно знаєте, куди розподіляється вся ваша пам’ять і чому її потрібно зберігати. Тим не менш, навіть якщо ви впевнені, що ваша програма може виправдати велику купу, вам слід уникати запитів, наскільки це можливо. Використання додаткової пам’яті все більше буде на шкоду загальному користувачеві, оскільки збирання сміття займе більше часу, а продуктивність системи може бути повільнішою при переключенні завдань або виконанні інших загальних операцій.

ось повне посилання на документацію https://developer.android.com/training/articles/memory.html

ОНОВЛЕННЯ

Після роботи неприємно, out of memory errorsя б сказав, що додавання цього в маніфест, щоб уникнути питання oom не є гріхом, також, як @Milad вказує нижче, це не впливає на нормальну роботу програми

ОНОВЛЕННЯ 2

Ось кілька порад , щоб мати справу зout of memory errors

1) Використовуйте ці зворотні дзвінки, які дає Android onLowMemory, onTrimMemory(int) і очистіть кеш зображень, таких як (пікассо, гліде, фреска ....), про них можна прочитати тут і тут
2) стиснути файли (зображення, pdf)
3) читати про як тут ефективніше працювати з растровою
картою


1
Чому ви говорите "це не впливає на нормальну роботу програми"? Ця відповідь обговорює деякі наслідки. В іншому місці я бачив ще гірші терміни, виміряні для великихHeap GC у деяких додатках.
ToolmakerSteve

59

Я думаю, що це дуже ефективне питання, і дозвольте мені додати деякі деталі про переваги та недоліки використання цього варіанту.

Що ви отримуєте:

  • Очевидно, ви отримуєте більшу купу, що означає зниження ризику OutOfMemoryError.

Що ти втрачаєш:

  • Ви можете втратити кілька кадрів, що може спричинити видиме замикання . Більша купа змушує сміття забирати більше часу. Тому що збирач сміття в основному повинен пройти весь ваш живий набір предметів. Зазвичай час паузи для збору сміття становить близько 5 мс, і ви можете подумати, що кілька мілісекунд - це не велика справа. Але кожен мілісекунд рахується. Android-пристрій повинен оновлювати свій екран кожні 16 мс, і довший час GC може перенести час обробки кадру через 16-мілісекундний бар'єр, що може спричинити видиме замикання.

  • Також комутація додатків стане повільнішою . Система Android може знищувати процеси в кеш-пам'яті LRU, починаючи з процесу, що використовується останнім часом, але також приділяє певну увагу, які процеси є найбільш інтенсивними в пам'яті. Отже, якщо ви використовуєте більшу купу, ваш процес, швидше за все, буде вбитий, коли він перебуває у фоновому режимі, а значить, може знадобитися більше часу, коли користувачі захочуть перейти з інших програм на ваші. Крім того, інші фонові процеси, швидше за все, будуть витіснені, коли ваш процес вийде на перший план, оскільки для вашої програми потрібна більша пам'ять. Це означає, що перехід від вашого додатка до інших додатків також займає більше часу.

Висновок:

Уникайте використання largeHeapопції якомога більше. Це може коштувати вам важко помітити зниження продуктивності та поганий досвід користувача.


17

У мене є додаток з майже 50 класами

Я не думаю, що це робить великі проблеми. Причина, чому ви вийшли з помилкиOfMemory, зазвичай завантажує занадто багато зображень у вашому додатку чи щось подібне. Якщо ви незадоволені, використовуючи велику купу, ви повинні знайти спосіб оптимізації використання пам'яті.

Ви також можете використовувати бібліотеки для завантаження зображень, такі як Picasso , UIL або Glide . Усі вони мають функцію кешування зображень у пам'яті та / або на диску.


1
для завантаження зображень я, як правило, рекомендую пікасо або універсальний завантажувач зображень
Mightian

5
Планування краще і трохи оптимізованіше, ніж Пікассо
Дамієн Прака

1
@DamienPraca Я не думаю, що принаймні, якщо ви правильно використовуєте теги (setTag (), pauseTag (), resumeTag ()) у Picasso.
Руслан Берозов

15

Насправді андроїд: LargeHeap - це інструмент для збільшення виділеної пам’яті до програми.

Немає чіткого визначення необхідності використання цього прапора. Якщо вам потрібно більше пам’яті - Android надає вам інструмент для її збільшення. Але необхідність використання ви визначаєте самі.


4
так, є чітке визначення, перейдіть за цим посиланням developer.android.com/training/articles/memory.html
Mightian

2
@war_Hero - можливо, ця стаття змінила свій зміст? У ньому немає жодної згадки про великупоміч.
ToolmakerSteve

7

Якщо ви повинні використовувати (і зберегти) великий об'єм пам'яті, то так, ви можете і повинні використовувати android:largeHeap="true". Але якщо ви все-таки користуєтесь цим, вам слід бути готовим до того, що ваш додаток буде видалено з пам'яті, коли інші програми стоять на першому плані.

Під «будьте готові» я маю на увазі, що ви повинні створити цю ймовірність, щоб ваші onStop()та onResume()методи були написані якомога ефективніше, забезпечуючи збереження та відновлення всіх відповідних станів таким чином, що представляє користувачеві безперебійний вигляд.

Є три способи , які відносяться до цього параметру: maxMemory(), getMemoryClass()і getLargeMemoryClass().

Для більшості пристроїв maxMemory()буде представляти аналогічне значення getMemoryClass()за замовчуванням, хоча останній виражається в мегабайтах, тоді як перший виражається в байтах.

При використанні largeHeapпараметра maxMemory()він буде збільшений до конкретного пристрою вищого рівня, при getMemoryClass()цьому залишиться колишнім.

getMemoryClass()не обмежує розмір нагромадження, але він повідомляє вам кількість купи, яку ви повинні використовувати, якщо ви хочете, щоб ваш додаток працював комфортно і сумісно в межах конкретного пристрою, на якому ви працюєте.

maxMemory()Навпаки, це обмежує розмір купи, і так ви отримаєте доступ до додаткової купі шляхом збільшення його вартості, і largeHeapробить збільшення даними значення. Однак збільшена кількість купи все ще обмежена, і ця межа буде залежати від пристрою, а це означає, що кількість купи, доступної вашому додатку, буде змінюватися в залежності від ресурсів пристрою, на якому працює ваш додаток. Таким чином, використання largeHeapне є запрошенням для вашої програми відмовитися від будь-якої обережності та проглянути свій шлях через шведський стіл, який можна їсти.

Ваш додаток може точно визначити, скільки пам’яті було б доступно на певному пристрої за допомогою largeHeapпараметра, посилаючись на метод getLargeMemoryClass(). Повернене значення знаходиться в мегабайтах.

Ця попередня публікація включає обговорення largeHeapпараметра, а також ряд прикладів того, яка кількість купи доступна за допомогою та без її використання на кількох конкретних пристроях Android:

Виявлення розміру купи додатків в Android

Я не розгорнув жоден власний додаток із цим параметром, встановленим на true. Однак у мене є деякий об'єм пам'яті в одному з моїх додатків для складання набору параметрів, пов'язаних з оптимізацією, який працює лише під час розробки. Я додаю largeHeapпараметр лише під час розробки, щоб уникнути помилок пам'яті під час виконання цього коду. Але я видаляю параметр (і код) перед розгортанням програми.


1
"відмовтесь від будь-якої обережності та пройдіть свій шлях через фуршет, який можна їсти" 😂
Джошуа Пінтер

4

Чи слід створювати процеси вашої програми за допомогою великої купи Dalvik. Це стосується всіх процесів, створених для програми. Це стосується лише першої програми, завантаженої в процес; якщо ви використовуєте спільний ідентифікатор користувача, щоб дозволити декільком програмам використовувати процес, усі вони повинні використовувати цю опцію послідовно, інакше вони матимуть непередбачувані результати.

У більшості додатків цього не потрібно, а натомість слід зосередитись на зменшенні загального використання пам’яті для підвищення продуктивності. Якщо це ввімкнути, це також не гарантує фіксованого збільшення наявної пам'яті, оскільки деякі пристрої обмежені загальною доступною пам'яттю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.