Опыт с анализом побега включен на JVM - PullRequest
7 голосов
/ 01 февраля 2010

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 01 февраля 2010

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

6 голосов
/ 02 февраля 2010

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

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

3 голосов
/ 01 февраля 2010

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

...