Отримання OutOfMemoryException у Xamarin


76

java.lang.OutOfMemoryError. Подумайте про збільшення значення $ (JavaMaximumHeapSize). У Java не вистачало пам'яті під час запуску 'java.exe'

У моєму Visualstudio Xamarin Project вичерпується пам’ять, будь ласка, допоможіть мені, як я можу вирішити цю проблему.


2
Я хотів би порекомендувати не лише встановити LargeHeap значення true. Натомість вам слід спробувати з'ясувати, що викликає цю OOM, і виправити це. В іншому випадку ви могли б придбати у вас деякий час, поки це не вдарить вас знову.
текіла шлеммер

Відповіді:


124

Я б збільшив розмір вашої збірки.

Клацніть правою кнопкою миші ваш проект Android> Властивості > Параметри Android > Додатково > Максимальний розмір купи Java .

введіть тут опис зображення


Так Ваше право. Але де я можу збільшити розмір мого додатка в Visual Studio Xamarin.
Srinivas Ch

3
@SrinivasCh У свій маніфест додайте android:largeHeap="true"тег, а потім стежте logcatза тим, Grow heap (frag case)щоб побачити, коли ART намагається виділити більше пам'яті
SushiHangover,

Працює добре Дякую за відповідь @lain Smith
Srinivas Ch

@SushiHangover Ах, добре, у мене була ця помилка раніше, і я просто збільшив купу тут, але ви маєте рацію, якщо хочете, щоб вам довелося використовувати велику купу, а потім відредагувати прояви
Іен Сміт,

@ Srinivas-Ch не хвилюйся
Іен Сміт

20

Вибрана відповідь веде мене в правильному напрямку, але для Visual Studio 2017 екран виглядає так:

Оновлені екрани VS 2017

Оновлені екрани VS 2017


18

Якщо ви хочете збільшити розмір купи вашої програми (а не процес збірки), ви можете встановити це у своєму AndroidManifest.xml:

<application android:largeHeap="true"></application>

12

Для Visual Studio 2015 клацніть правою кнопкою миші Проект -> Властивості -> Параметри Android -> Додатково та розмір купи там.


Зробіть це: клацніть лівою кнопкою миші <проект> .Droid -> Двічі клацніть «Властивості» -> Клацніть «Параметри Android» ліворуч -> Клацніть вкладку «Додатково» -> «Максимальний розмір купи Java»
LionelGoulet

7

Станом на Xamarin studio версії 6.3 та visual studio 7.0.1 опцію збільшення розміру купи можна знайти тут

Клацніть правою кнопкою миші на проекті android, потім виберіть параметри та виберіть Build / Android Build , потім вкладку Додатково та встановіть 1G (або щось інше) у розмірі купи Java

введіть тут опис зображення


4

Коли у вас закінчиться розмір купи 1G, почніть оптимізувати ресурси.

Спочатку перевірте, чи не дублюєте ви екземпляри зображень, зберігаючи одне і те ж зображення в пам'яті кілька разів. Для цього використовуйте бібліотеку ffimageloading ( https://github.com/luberda-molinet/FFImageLoading ) швидко і просто завантажте її на nuget.

Потім оптимізуйте зображення, які ви використовуєте. Для великих зображень, крім піктограм, спробуйте перетворити все на jpeg, уникаючи png з прозорістю, що колись врятувало мене для постійних звуків.

Потім спробуйте використовувати ескізи замість зображень, коли на пульті можуть бути великі завантажені зображення. На вашому сервері заздалегідь створіть мініатюри різних розмірів, міні, малі, середні, звичайні, великі, великі тощо, і завантажте лише зображення потрібного вам розміру. Це економить багато пам’яті та швидкості.

Інший - витік пам'яті. Можливо, клітини або інші елементи все ще зберігаються в пам'яті, якщо вони не відписалися від повідомлень, обробників подій та деяких інших. Уявіть, що у вас може бути кілька копій списку, повного зображень, які все ще є в пам'яті, коли ви впевнені, що цього не могло статися. Більше інформації тут:

https://forums.xamarin.com/discussion/123876/should-we-unsubscribe-all-events-for-memory-management

https://forums.xamarin.com/discussion/87206/messaging-center-unsubscribe-from-all-messages-when-broadcast-stops


2

На моєму досвіді, проблеми з пам’яттю трапляються ТІЛЬКИ в андроїд-версії програми Xamarin.Forms. І це завжди має справу з великими зображеннями. Я вирішив цю проблему за допомогою FFImageLoading ( https://github.com/luberda-molinet/FFImageLoading )

Замініть свій

<Image Source="waterfront.jpg" />

С

<ffimageloading:CachedImage Source="waterfront.jpg"
DownsampleToViewSize = true,
BitmapOptimizations = true/>

Ви побачите різке покращення продуктивності, а також це вирішить ваші проблеми з пам’яттю.



-1

Я виправив додавання нижче в тегу програми AndroidManifiest.xml

<application  android:largeHeap="true" android:label="sample"></application>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.