В одном из наших предыдущих постов я писал о нашей проблеме с JVM CodeCache. Этот кеш используется для сохранения скомпилированного машинного кода, и если ваше Java-приложение генерирует новый код на лету, он в конечном итоге заполнится.

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

Через некоторое время я вернулся к проблеме и решил ее. Не могу сейчас вспомнить, пробовал ли я в то время самое очевидное — включить промывку. Я, вероятно, сделал это, но поскольку некоторые очистки кеша были видны до его заполнения, возможно, я убедил себя, что происходит очистка, и я не включил ее. В любом случае, позвольте мне описать вам все шаги, которые, в конце концов, помогли нам.

Как я уже писал ранее, мы используем компилятор Janino для компиляции многих сгенерированных классов. Janino был определен как синглтон в нашем приложении. Моя идея заключалась в том, что машинный код может застрять в CodeCache, потому что скомпилированные классы никогда не освобождаются сборщиком мусора. Я до сих пор не знаю, верна ли идея, но это все равно утечка памяти, несмотря ни на что. Скомпилированные классы хранятся в ClassLoader внутри экземпляра компилятора, и этот экземпляр существует на протяжении всего времени жизни приложения. Возможно, это не большая проблема, если у вас много памяти, но я все равно создаю экземпляр компилятора для каждой компиляции, так как в нашем случае производительность невелика.

И, конечно же, сброс должен быть включен вручную (-XX:+UseCodeCacheFlushing), потому что по умолчанию он не активен. После этого я наконец-то увидел «пилу» в сюжете. Интересно, что после второго пика я все равно наблюдал в логе ошибку, что компиляторы выключены. Хотя кеш сбрасывался. Возможно, они были запущены позже, и это не было зарегистрировано, но, поскольку это произошло только один раз, и я не хочу тратить больше времени на эту проблему, я доволен тем, что мы имеем сейчас.

Автор: Людек Новотны