у нас просто было совещание для решения некоторых проблем с производительностью в веб-приложении, которое используется для расчета ставок страхования. Расчеты выполняются в модуле C/С++, который также используется в других пакетах программного обеспечения. Чтобы сделать его доступным как веб-сервис, была реализована оболочка Java, которая предоставляет интерфейс на основе XML и вызывает модуль C/С++ через JNI.
Измерения показали, что несколько секунд были потрачены на каждый расчет внутри части Java. Таким образом, моя первая рекомодация заключалась в том, чтобы включить ведение журнала сбора мусора в виртуальной машине. Мы сразу увидели, что было сделано много прекрасных глобальных ГК. Говоря об этом, разработчик java-части сказал нам, что они несколько раз выполняли System.gc()
"чтобы убедиться, что память выпущена после использования".
ОК, я не буду подробно останавливаться на этом утверждении...; -)
Затем мы добавили вышеприведенные -XX:+DisableExplicitGC
аргументы виртуальных машин и повторили тесты. Это набрало около 5 секунд на расчет.
Так как мы не можем изменить код, сняв все эти вызовы System.gc()
в этот момент нашего процесса выпуска, мы думаем о добавлении -XX:+DisableExplicitGC
в производство до тех пор, пока не будет создан новый Jar.
Теперь возникает вопрос: может ли быть какой-то риск? Единственное, о чем я могу думать, это tomcat, использующий System.gc()
внутренне при перераспределении, но это только предположение. Есть ли еще какие-то опасности?