Подтвердить что ты не робот

Как отключить сборщик мусора Java?

У нас есть веб-приложение PHP, которое вызывает двоичный файл Java для создания отчета в формате PDF (с JasperReports). Двоичный файл Java выводит PDF на стандартный вывод и завершает работу; PHP затем отправляет PDF в браузер. Эта команда Java длится от 3 до 6 секунд, и я думаю, что когда она длится 6 секунд, она запускается из-за GC. Я хотел бы отключить GC, потому что в любом случае, когда команда выходит из системы, возвращается вся память.

Я хотел бы знать, как отключить его для Java 1.4.2 и для Java 1.6.0, потому что в настоящее время мы тестируем обе JVM, чтобы увидеть, какая из них работает быстрее..

4b9b3361

Ответ 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;