2016-05-19 7 views
1

Error:Uncaught translation error: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded api 19OutOfMemoryError: превышение верхнего предела GC превысило api 19

Что теперь?

Эта ошибка возникает только тогда, когда я пытаюсь запустить ее на эмуляторе API 19 (как говорит текст ошибки). Так что хорошо, я получаю, что, похоже, мое приложение только недавно стало большим ... Или это?

Я думаю, что на самом деле я не совсем понимаю эту ошибку. Что значит прочее, тогда мне нужно увеличить размер кучи?

Следующий вопрос: Неправильно ли это увеличить? Могу ли я увеличить его для API 19 и оставить его там, где он предназначен для других, поскольку он работает безупречно напр. API 23?

Что делать, если я не хочу его увеличивать? Как узнать, что делает это настолько большим? Что я могу сделать в целом, чтобы оно было маленьким?

Так что это очень много вопросов, и держать их хорошие модераторы от говорить мне размещать только один вопрос, вот он, финал и все, включая вопрос: Если это плохо, чтобы увеличить размер кучи, что мне нужно сделать, чтобы избежать получения этой ошибки?

ответ

0

У вас возникла эта проблема?

Во время компиляции или во время запуска приложения?

В случае первого вы должны убедиться, что ваша куча является большой на этапе компиляции. Если вы используете Gradle, вы бы добавить что-то вроде этого в сценарий:

dexOptions { 
    javaMaxHeapSize "2g" 
} 

В случае второй - ошибки происходит при запуске вашего приложения, вы, вероятно, нужно перепроектировать приложение, так что потребляет меньше памяти. Вы не можете управлять параметрами JVM устройств пользователя.

EDIT: Я не знаю, почему существует разница между двумя уровнями API, но я думаю, что это имеет какое-то отношение к тому факту, что из уровня API 21 используется другое время выполнения (АРТ). Подробнее об этом можно узнать здесь: https://developer.android.com/studio/build/multidex.html Фаза сборки, возможно, немного отличается из-за этого, что приводит к различным требованиям к памяти между уровнями API.

+0

Я получаю его во время компиляции по градиенту ... Будет ли «javaMaxHeapSize» 2g «' влиять только на фазу компиляции? Или это также влияет на выход? – Maverick283

+0

Посмотрите, вот где моя погрешность похоронена: я не понимаю, почему компиляция для выполнения на устройстве api 23 не дает такой же ошибки.Насколько я понимаю, вывод того, что я компилирую, не зависит от того, для какого устройства я его использую. – Maverick283

+0

Это влияет только на этапе компиляции, это не повлияет на размер кучи приложения во время его работы. –

0

Насколько я знаю, нет никакого способа увеличить кучу на реальном телефоне, возможно только увеличить кучу в эмуляторе. Опыт, который я сделал, заключается в том, что каждое устройство имеет собственный фиксированный размер кучи, используемый виртуальной машиной. У меня была такая же проблема, что некоторые из моих приложений не работали на «старых» версиях Android/API. Я использовал свой старый Samsung Galaxy S2, который имеет только 64 МБ кучи, и это не может быть изменено.

Окончательное решение для меня состояло в том, чтобы профилировать мое приложение и сделать много редизайна, чтобы как-то уменьшить потребление памяти моего приложения. К счастью, Google уже написал некоторые вещи по этой теме и как подойти к ней. Предлагаю начать читать Managing Your App's Memory и Investigating Your RAM Usage. Там вы найдете все, чтобы начать работу с профилированием потребления памяти вашего приложения.

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