Как отключить сборщик мусора Java?
У нас есть веб-приложение PHP, которое вызывает двоичный файл Java для создания отчета в формате PDF (с JasperReports). Двоичный файл Java выводит PDF на стандартный вывод и завершает работу; PHP затем отправляет PDF в браузер. Эта команда Java длится от 3 до 6 секунд, и я думаю, что когда она длится 6 секунд, она запускается из-за GC. Я хотел бы отключить GC, потому что в любом случае, когда команда выходит из системы, возвращается вся память.
Я хотел бы знать, как отключить его для Java 1.4.2 и для Java 1.6.0, потому что в настоящее время мы тестируем обе JVM, чтобы увидеть, какая из них работает быстрее..
Ответы
Ответ 1
Невозможно полностью отключить сбор мусора. Сбор мусора запускается только тогда, когда JVM исчерпывает место, поэтому вы можете дать программе больше памяти. Добавьте эти параметры командной строки в команду Java
-Xmx256M -Xms256M
Это дает программу 256 Мб оперативной памяти (по умолчанию 64 Мб). Сбор мусора не займет 3 секунды для JVM размера по умолчанию, хотя, возможно, вам захочется более внимательно изучить, что делает программа. Профайлер Yourkit очень полезен для выяснения того, что занимает много времени.
Ответ 2
Похоже, вы пытаетесь сэкономить время, но не так. Время, затраченное на отключение сбора мусора, будет тривиальным (для одной задачи) по сравнению с временем, затраченным на запуск и завершение работы с java-процессом. Возможно, вам стоит подумать о запуске Java-процесса, который вы можете попросить несколько раз выполнить требуемую работу, если ваша задача - время выполнения.
Ответ 3
GC запускается только тогда, когда JVM является коротким в памяти, поэтому вы либо GC, либо умираете. Попробуйте включить подробный GC и посмотреть, действительно ли это занимает значительное количество времени.
java -verbose:gc
Ответ 4
Java 11 поставляется без сборщика мусора.
Его можно включить с помощью -XX:+UseEpsilonGC
при запуске JVM.
Согласно описанию JEP, одна из его целей состоит в том, чтобы сделать некоторые краткосрочные рабочие места более эффективными, что может быть вашим примером использования:
Чрезвычайно недолгая работа. Кратковременное задание может зависеть от быстрого выхода для освобождения ресурсов (например, кучи памяти). В этом случае принятие цикла GC для тщетной очистки кучи является пустой тратой времени, поскольку в любом случае кучи будет освобождена при выходе. Обратите внимание, что цикл GC может занять некоторое время, потому что он будет зависеть от количества активных данных в куче, что может быть много.
Ответ 5
Вы можете использовать опцию -Xmx
, чтобы установить максимальный размер кучи; использование большей кучи должно препятствовать тому, чтобы виртуальная машина вышла из памяти и, таким образом, потребовала сбор мусора так скоро.
Ответ 6
Вы уверены, что это сбор мусора, вызывающий замедление? Вы запускаете java с помощью -verbose: gc, чтобы увидеть, что происходит?
Вы не можете отключить сбор мусора на JVM. Вы могли бы, однако, посмотреть tuning сборщик мусора для лучшей производительности.
Ответ 7
Как и все, как сказано, вы не можете отключить GC в JVM, что имеет смысл, потому что, если бы вы могли потерять память из-за того, что java не имел явного способа для разработчика удалить данные кучи.
У вас есть доступ к источнику этого java-бинара? Если это так, возможно, стоит проанализировать это и увидеть, есть ли какие-нибудь бутылочные шейки, которые можно было бы лучше написать, чтобы сократить работу GC. Это можно сделать с помощью большинства профилей java, например JProbe.
Ответ 8
Чтобы избежать сборщика мусора, выпустите переменную или свойство из любого объекта,
вы должны установить это свойство (выпущенное gc) как статическое в своем классе
это было мое решение.
Пример:
private static String myProperty;