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

Что вызывает утечку кеша JV 6 JVM?

С момента перехода на JRE 6, использование кеша кода сервера (не куча) продолжает расти бесконечно. Мое приложение создает много классов во время выполнения, НО эти классы успешно разгружаются во время процесса GC. Я вижу, что эти классы выгружаются в журналы gc, а использование permGen остается постоянным. Я специально убеждаюсь в своем коде, что эти классы сироты, когда я закончу их, и поэтому они правильно получают мусор, собранный из permGen.

Тем не менее кеш-код продолжает расти. Я только узнал о кеше кода после переключения на JRE 6. Поэтому я думаю, что мои вопросы:

  • Включает ли GC кеш кода?
  • Что может вызвать утечку памяти кэша кода, в частности.
  • Есть ли ошибка в JDK 6 в этой области?
4b9b3361

Ответ 1

Вы можете просмотреть это обсуждение и просто вернуться назад, чтобы узнать, что может быть полезно в попытке сузить это: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2009-January/000530.html

В этом участвует JDK5, но может быть полезным: http://www.nabble.com/Java-code-cache-memory-td22202283.html

Используете ли вы это для компиляции jsp-страниц или чего-то подобного? Если нет, что компилируется после запуска приложения? Используете ли вы AspectJ с плетением во время выполнения?

Это поможет узнать, что вы делаете, чтобы лучше понять, как помочь.

Кроме того, когда кеш кода исчерпан, он просто прекращает компиляцию заново или происходит сбой jvm? Я бы ожидал первого.

Используете ли вы Sun JDK? Я предполагаю, что вы с тех пор, как я сомневаюсь, что остальные перечислены как версия 6, но это не помешает спросить.

Ответ 2

Мне было интересно, поможет ли вам новый сборщик мусора G1 (начиная с версии 6 для Java 6). Вы можете попробовать его с помощью -XX: + UnlockExperimentalVMOptions -XX: + UseG1GC, однако согласно комментариям к блогу Jon Masamitsu он не будет (если проблема действительно связана с кэшем кода). Но, возможно, обсуждение там или ссылки могут помочь.

Ответ 3

Из комментариев в этом сообщении в блоге: http://blogs.oracle.com/jonthecollector/entry/our_collectors

выдается код при разгрузке классов (как так же, как когда методы "недействительны", т.е. некоторые предположения были сделанные во время их компиляции, которые больше не сохраняются)

Если бы я был вами, я бы выполнил рабочую нагрузку, взял кучу кучи и проверил, будут ли все классы gc'd, которые вы ожидаете.

Ответ 4

В двух возможных местах я бы искал проблему: "Просочившиеся погрузчики" и "Массивные струны".

Из вашего описания приложения, я бы скорее проверил, будут ли старые сгенерированные классы выгружаться GC.

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

Ответ 5

Можно ли использовать jvisualvm (в JDK) против неприятного приложения? Это может легко сделать вас намного более мудрее о том, что происходит.

Ответ 6

  • нет, но вы можете использовать флаг -XX: + UseCodeCacheFlushing, чтобы позволить JVM удалять часть скомпилированного кода, когда кеш-код заполняется, хотя иногда это не так полезно. try -XX: ReservedCodeCacheSize и -XX: CompileThreshold.
  • время от времени горячее развертывание и т.д.

см. больше: https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-4-heap-tuning/