2010-05-28 2 views
26

У нас есть PHP webapp, который вызывает двоичный код java для создания отчета в формате pdf (с jasperreport), java-бинарного outpus pdf для стандартного вывода и выходов, затем php отправляет PDF в браузер. Эта команда java длится от 3 до 6 секунд, я думаю, что когда она длится 6 секунд, это происходит потому, что GC запускается, поэтому я хотел бы отключить его, так как в любом случае, когда команда выходит из всей памяти, возвращается.Как отключить сборщик мусора Java?

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

Благодаря

+7

Просто намек на другой подход (так как процесс запуска также требует времени): http: // github.com/hudora/pyJasper содержит (java) -сервер, который запускает jasperreports по запросам без накладных расходов на запуск/завершение процесса. – ZeissS

+0

Связанные с конкретными объектами: http://stackoverflow.com/questions/1329926/how-to-prevent-an-object-from-getting-garbage-collected –

ответ

25

Невозможно полностью отключить сбор мусора. Сбор мусора запускается только тогда, когда JVM исчерпывает место, поэтому вы можете дать программе больше памяти. Добавьте эти параметры командной строки для команды Java

-Xmx256M -Xms256M 

Это дает программа 256Mb оперативной памяти (по умолчанию 64Mb). Сбор мусора не займет 3 секунды для JVM размера по умолчанию, хотя, возможно, вам захочется более внимательно изучить, что делает программа. Yourkit profiler очень полезно для выяснения того, что занимает много времени.

24

GC только пинает в когда JVM не хватает на память , так что вы либо GC, либо умереть. Попробуйте включить подробный GC и посмотреть, действительно ли это занимает значительное количество времени.

java -verbose:gc 
+1

Умм, возможно, я мог бы использовать переключатель командной строки, чтобы дать ему больше память и, следовательно, увеличивают вероятность того, что GC не ударит .. – Nelson

+1

Да, вы узнаете, если вам нужно это сделать, проанализировав вывод verbose: gc. Это первый шаг. – unbeli

+6

+1 для «теста, не угадай». Разница во времени может быть чем-то совершенно несвязанным, например, с конфликтом ввода-вывода или с тяжелым процессом процессора. – gustafc

1

Вы уверены, что это сбор мусора, вызывающий замедление? Вы запускаете java с помощью -verbose: gc, чтобы увидеть, что происходит?

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

2

Вы можете использовать опцию -Xmx, чтобы установить максимальный размер кучи; использование большей кучи должно препятствовать тому, чтобы VM вышла из памяти и, таким образом, потребовала сбор мусора так скоро.

+2

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

33

Звучит так, будто вы пытаетесь сэкономить время, но это не так. Время, затраченное на отключение сбора мусора, будет тривиальным (для одной задачи) по сравнению с временем, затраченным на запуск и завершение работы с java-процессом. Возможно, вам стоит подумать о запуске Java-процесса, который вы можете попросить несколько раз выполнить требуемую работу, если ваша задача - время выполнения.

+1

Хороший ... это, по-моему, спасло бы и инициализацию яшмы. – helios

+0

Да, это хороший подход, хотя больше работы над этим, я должен был бы закодировать своего рода демон, который будет прослушивать сокеты и т. Д. Кроме того, этот «демон» должен быть перезапущен один раз за X дней .. вызвать java утечка памяти в конечном итоге (по моему опыту). – Nelson

+0

@Nelson. Посмотрите, можете ли вы использовать что-то вроде Mule для размещения ваших процессов Java и позволить им обрабатывать все сообщения для вас. Идея состоит в том, что вам просто нужно встроить свой JasperReports в качестве службы, которую ESB может размещать и направлять запросы по мере необходимости. Mule: http://www.mulesoft.com/mule-esb-open-source-esb –

0

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

У вас есть доступ к источнику java-файла? Если это так, возможно, стоит проанализировать это и увидеть, есть ли какие-нибудь бутылочные шейки, которые можно было бы лучше написать, чтобы сократить работу GC. Это можно сделать с помощью большинства профилей-профилей java, например JProbe.

+0

Java-бинар очень прост, он просто извлекает параметрические параметры командной строки и выполняет вызовы в функции jasperreport для создания отчета, который передается в выходной поток System.out, где PHP читает его через функцию «сквозной». Итак, время тратится на Jasperreport, прорабатывая отчет, вот как мне хотелось ускорить Java. – Nelson

+0

Похоже, что контроль настроек JVM GC - это ваш единственный авеню здесь. – display101

0

Чтобы избежать сборщика мусора, выведите переменную или свойство из любого объекта, , вы должны установить это свойство (выпущенное gc) как статическое в своем классе , это было мое решение.

Пример:

частных статических строк MyProperty;

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