Я пытаюсь написать процедуру разминки для чувствительного к задержкам приложения Java, чтобы оптимизировать первые несколько транзакций, которые в противном случае были бы замедлены динамической загрузкой классов и JIT (главным образом).
Проблема, с которой я сталкиваюсь, заключается в том, что хотя мой код разгрузки загружает все классы и выполняет их, вызывая их много раз (по крайней мере 100 раз -XX: CompileThreshold), позже, когда фактический пользователь регистрируется на этих же функциях помечен как "non entrant" и снова скомпилирован, что вызывает латентность.
Флаги JVM следующие (я добавил только -XX: + PrintCompilation -verbose: устранить неполадки класса tp, остальные - устаревшие):
-Xms5g -Xmx5g -server -XX: + AggressiveHeap -XX: + UseFastAccessorMethods -XX: + PrintGCDetails -XX: CompileThreshold = 100 -XX: -CITime -XX: -PrintGC -XX: -PrintGCTimeStamps -XX: + PrintCompilation -verbose: класс
#Warmup happens here
12893 2351 my.test.application.hotSpot (355 bytes)
#Real user logs on here
149755 2351 made not entrant my.test.application.hotSpot (355 bytes)
151913 2837 my.test.application.hotSpot (355 bytes)
152079 2351 made zombie my.test.application.hotSpot (355 bytes)
Никакая загрузка классов не происходит после разминки (я вижу загрузку класса, прежде чем он работает).
Похоже, что функция получает новый ID (2351 против 2837), что означает, что JVM как-то считается "другим".
И как я могу определить, почему JVM решил перекомпилировать эту функцию?
И я думаю, это сводится к тому, как я могу определить, почему изменился идентификатор? Каковы критерии?
Я пробовал отмечать как можно больше методов и классов, чем я мог, но безрезультатно.
Это JRE 1.6.0_45-b06.
Любые советы по устранению неполадок или получения дополнительной информации!:)