Опыт с анализом побега включен на JVM

Я только что попробовал -XX:+DoEscapeAnalysis опция включена на виртуальной машине jdk6-u18 (на солярисе) и имела довольно разочаровывающий опыт. Я запускаю приложение scala, в котором довольно много актеров (20000 из них). Это рецепт для создания мусора!

Обычно приложение может работать с 256 МБ кучи, но генерирует огромное количество мусора. В своем устойчивом состоянии это:

  • проводит 10% времени в GC
  • генерирует>150 МБ мусора за <30 с, который затем получает GC'd

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

На данный момент я должен сказать, что приложение не бросило OutOfMemoryError что я бы ожидал. возможно JConsole (который я использовал для выполнения анализа) не отображает статистику GC с этой опцией (я не уверен)?

Затем я удалил эту опцию и перезапустил, и приложение снова стало "нормальным"! У кого-нибудь есть идеи, что может происходить?

3 ответа

Решение

1 Был ли Escape-анализ включен в JConsole? Вам нужно убедиться, что вы используете виртуальную машину с параметром -server. Я предполагаю, что у вас это работает, но я просто подумал, что проверю.

2 Я не думаю, что анализ побега поможет ситуации с Scala Actors. Вы можете увидеть большой выигрыш, если вы сделаете что-то вроде:

def act():Unit = {
   val omgHugeObject = new OMGHugeObject();
   omgHugeObject.doSomethingCrazy();
 }

В приведенном выше примере EscapeAnalysis сделает это так omgHugeObject может быть размещен в стеке вместо кучи и, следовательно, не создает мусора. Я не думаю, что вполне вероятно, что анализ побега поможет с актерами. Их ссылки всегда "уходят" в подсистему актера.

3 Вы на последнем выпуске Scala? Была утечка памяти, которая, я считаю, была исправлена ​​в последней версии. Это даже привело к тому, что Lift порождает собственную библиотеку Actor, в которую вы можете заглянуть.

4 Вы можете попробовать сборщик мусора G1. Вы можете включить его с помощью:

-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

Из примечаний к выпуску jdk-u18:

Обратите внимание, что оптимизация на основе Escape-анализа (-XX:+DoEscapeAnalysis) отключена в 6u18. Эта опция будет восстановлена ​​в будущем обновлении Java SE 6.

Я предлагаю вам попробовать увеличить размер нового поколения, например, -XX:NewSize=96M XX:NewRatio=3, Используйте JVisualVM (входит в JDK) с плагином Visual GC, чтобы посмотреть, как используются старое и старое пространство.

Другие вопросы по тегам