Я получаю это сообщение об ошибке при выполнении моих тестов JUnit:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Я знаю, что OutOfMemoryError
такое, но что означает ограничение по накладным расходам GC? Как я могу решить это?
Я получаю это сообщение об ошибке при выполнении моих тестов JUnit:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Я знаю, что OutOfMemoryError
такое, но что означает ограничение по накладным расходам GC? Как я могу решить это?
OutOfMemoryError
сценариев, для которых увеличение кучи не является допустимым решением: исчерпание собственных потоков и исчерпание perm gen (который отделен от кучи) являются двумя примерами. Будьте осторожны, делая слишком широкие заявления оOutOfMemoryErrors
; есть неожиданно разнообразный набор вещей, которые могут вызвать их.Ответы:
Это сообщение означает, что по какой-то причине сборщик мусора занимает слишком много времени (по умолчанию 98% всего процессорного времени процесса) и восстанавливает очень мало памяти при каждом запуске (по умолчанию 2% кучи).
Это фактически означает, что ваша программа перестает делать какой-либо прогресс и все время занята только сборкой мусора.
Чтобы приложение не впитывало процессорное время без каких-либо действий, JVM выдает это,
Error
чтобы у вас была возможность диагностировать проблему.Редкие случаи, когда я видел это, - это когда какой-то код создавал тонны временных объектов и тонны объектов со слабыми ссылками в среде с уже очень ограниченным объемом памяти.
Ознакомьтесь с руководством по настройке Java GC, которое доступно для различных версий Java и содержит разделы об этой конкретной проблеме:
источник
Цитата из статьи Oracle « Настройка виртуальной машины Java SE 6 HotSpot [tm]» :
РЕДАКТИРОВАТЬ: похоже, кто-то может печатать быстрее, чем я :)
источник
-XX:
начале нескольких параметров командной строки находится своего рода флаг, указывающий, что этот параметр сильно зависит от ВМ и нестабилен (может быть изменен без уведомления в будущих версиях). В любом случае-XX:-UseGCOverheadLimit
флаг указывает виртуальной машине отключить проверку ограничения накладных расходов GC (фактически «выключает»), тогда как ваша-Xmx
команда просто увеличила кучу. В последнем случае проверка издержек GC все еще выполняется , это звучит так, как будто большая куча решила проблемы с перебором GC в вашем случае (это не всегда помогает).Если вы уверены, что в вашей программе нет утечек памяти , попробуйте:
-Xmx1g
.-XX:+UseConcMarkSweepGC
.При необходимости проверку лимита можно отключить, добавив эту опцию
-XX:-UseGCOverheadLimit
в командную строку.источник
List
объекта внутри цикла вызвало вызов GC 39 раз вместо 22 раз.Обычно это код. Вот простой пример:
Использование Java 1.6.0_24-b07 в 32-разрядной версии Windows 7.
Тогда посмотрите на
gc.log
Конечно, это не лучший тест или лучший дизайн, но когда вы сталкиваетесь с ситуацией, когда у вас нет выбора, кроме как реализовать такой цикл или когда вы имеете дело с существующим кодом, который ведет себя плохо, выбор повторного использования объектов вместо создания новых может уменьшить сколько раз мешает сборщик мусора ...
источник
gc.log
файле. Мои тесты показывают гораздо меньшее количество раз, но меньшее количество «триггеров» для ЛУЧШИХ, и теперь BAD «хуже», чем WORST сейчас. Мои счета: плохо: 26, хуже: 22, лучше 21.List<Double> list
в наружном контуре вместо до того внешнего цикла, и Срабатывает 39 мусора коллекции.Причина ошибки в соответствии с платформой Java [8], Руководство по устранению неполадок Standard Edition : (выделение и разрывы строк добавлены)
Помимо установки кучи памяти с помощью -
Xms1g -Xmx2g
, попробуйтеПосмотрите еще несколько связанных вопросов, касающихся G1GC
Java 7 (JDK 7) сборка мусора и документация по G1
Сборка мусора Java G1 в производстве
Статья о технической сети Oracle для тонкой настройки GC
источник
Просто увеличьте размер кучи, установив эту опцию в
Выполнить → Выполнить настройки → Аргументы → Аргументы виртуальной машины
Xms - для минимального лимита
Xmx - для максимального лимита
источник
arguments
вкладки ... что мы должны сделать, чтобы достичь этого?Для меня сработали следующие шаги:
eclipse.ini
файл+ Изменить
в
Перезапустите Eclipse
Посмотреть здесь
источник
попробуй это
открыть
build.gradle
файлисточник
Следующее сработало для меня. Просто добавьте следующий фрагмент:
источник
увеличьте javaMaxHeapsize в вашем файле build.gradle (модуль: приложение)
(добавить эту строку в Gradle)
источник
Описание размера кучи Java (xms, xmx, xmn)
Устанавливает начальный размер кучи Java. Размер по умолчанию - 2097152 (2 МБ). Значения должны быть кратны и превышать 1024 байта (1 КБ). (Флаг -server увеличивает размер по умолчанию до 32M.)
Устанавливает начальный размер кучи Java для поколения Eden. Значением по умолчанию является 640K. (Флаг -server увеличивает размер по умолчанию до 2M.)
Устанавливает максимальный размер, до которого может расти куча Java. Размер по умолчанию составляет 64M. (Флаг -server увеличивает размер по умолчанию до 128 МБ.) Максимальный предел кучи составляет около 2 ГБ (2048 МБ).
Форматирование аргументов памяти Java (xms, xmx, xmn)
При установке размера кучи Java вы должны указать аргумент памяти, используя одну из букв «m» или «M» для MB, или «g» или «G» для GB. Ваши настройки не будут работать, если вы укажете «МБ» или «ГБ». Допустимые аргументы выглядят так:
-Xms64m или -Xms64M -Xmx1g или -Xmx1G Можно также использовать 2048 МБ для указания 2 ГБ. Также убедитесь, что вы просто используете целые числа при указании аргументов. Использование -Xmx512m является допустимым параметром, но -Xmx0.5g вызовет ошибку.
Эта ссылка может быть полезна для кого-то.
источник
Вы также можете увеличить выделение памяти и размер кучи, добавив это в свой
gradle.properties
файл:org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
Это не должно быть 2048M и 32g, сделайте его таким большим, как вы хотите.
источник
Решено:
Просто добавьте
org.gradle.jvmargs=-Xmx1024m
в
gradle.properties
и если она не существует, создайте его.
источник
Я работаю в Android Studio и столкнулся с этой ошибкой при попытке создать подписанный APK для выпуска. Я смог создать и протестировать отладочный APK без проблем, но как только мне захотелось создать релизный APK, процесс сборки будет выполняться несколько минут подряд, а затем в конце завершится с сообщением об ошибке «Ошибка java.lang.OutOfMemoryError: GC». превышен лимит накладных расходов ". Я увеличил размеры кучи для виртуальной машины и компилятора Android DEX, но проблема осталась. Наконец, после многих часов и кружек кофе выяснилось, что проблема была в моем файле уровня приложения «build.gradle» - у меня был параметр «minifyEnabled» для типа сборки выпуска, установленный в «false», в результате чего работали компоненты Proguard. в коде, который еще не прошел процесс сжатия кода (см. https://developer.android.). Я изменил параметр 'minifyEnabled' на 'true' и сборка релиза была выполнена как мечта :)
Короче говоря, мне пришлось изменить файл уровня приложения build.gradle с: // ...
в
источник
Чтобы увеличить размер кучи в IntelliJ IDEA, выполните следующие инструкции. Это сработало для меня.
Для пользователей Windows,
Перейдите в место, где установлена IDE, и выполните поиск следующего.
Отредактируйте файл и добавьте следующее.
Вот и все !!
источник
Вы можете попытаться внести изменения в настройку сервера, обратившись к этому изображению и увеличив объем памяти для обработки изменений процесса, выделенных желтым цветом.
Вы также можете внести изменения в кучу Java, открыв cmd->
set _java_opts -Xmx2g
2g (2 гигабайта) в зависимости от сложности вашей программы
попробуйте использовать менее постоянные и временные переменные
источник
Вам нужно увеличить размер памяти в Jdeveloper, перейти в setDomainEnv.cmd .
а также
источник
В Netbeans может быть полезно создать максимальный размер кучи. Перейдите в Run => Set Configuration Configuration => Customize . В появившемся окне « Выполнить» откройте « Параметры виртуальной машины» и заполните
-Xms2048m -Xmx2048m
. Это может решить проблему размера кучи.источник
Перезагрузка моего MacBook исправила эту проблему для меня.
источник
Я не знаю, актуально ли это до сих пор или нет, но просто хочу поделиться тем, что сработало для меня.
Обновите версию kotlin до последней доступной. https://blog.jetbrains.com/kotlin/category/releases/
и это сделано.
источник