2010-02-01 4 views
7

Je viens d'essayer l'option -XX:+DoEscapeAnalysis activée sur un jdk6-u18 VM (sur solaris) et j'ai eu une expérience plutôt décevante. Je cours une application de scala qui a plutôt beaucoup d'acteurs (20 000 d'entre eux). Ceci est une recette pour la création d'ordures!Expériences d'analyse d'échappement activées sur la JVM

Généralement, l'application peut fonctionner avec 256 Mo de tas, mais génère énorme quantités d'ordures. Dans son état d'équilibre il:

  • 10% de dépense de temps en GC
  • génère> 150Mo de déchets dans < 30 ans qui est ensuite GC'd

Je pensais que l'analyse d'échappement pourrait aide donc j'ai activé l'option et relancé l'application. J'ai trouvé que l'application est devenue de plus en plus incapable de nettoyer les déchets qu'elle avait collectés jusqu'à ce qu'il semble finalement passer le temps complet faire GC et l'application était "flat-line" à sa pleine allocation.

À ce stade, je dois dire que l'application n'a pas jeté un OutOfMemoryError que je m'attendais. Peut-être que JConsole (que j'utilisais pour effectuer l'analyse) n'affiche pas correctement les statistiques du GC avec cette option (je ne suis pas convaincu)? J'ai ensuite retiré l'option et redémarré et l'application est redevenue "normale"! Quelqu'un a-t-il une idée de ce qui pourrait se passer?

Répondre

8

L'analyse d'échappement a-t-elle été activée dans JConsole? Vous devez vous assurer que vous exécutez la machine virtuelle avec l'option -server. Je suppose que vous avez eu ce travail, mais je pensais juste vérifier. Je ne pense pas que l'analyse d'échappement aidera la situation avec Scala Actors. Vous pouvez voir un grand gain si vous faites quelque chose comme:

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

Dans l'exemple ci-dessus EscapeAnalysis ferait si omgHugeObject pourrait être allouée sur la pile à la place du tas et donc pas créer des ordures. Je ne pense pas qu'il est probable que l'analyse d'évasion aidera les acteurs. Leurs références «s'échapperont» toujours au sous-système de l'acteur.

Êtes-vous sur la version la plus récente de Scala? Il y avait une fuite de mémoire qui, je crois, a été corrigée dans une version récente. Cela a même fait apparaître Lift sur sa propre bibliothèque Actor que vous pourriez examiner.

Vous pouvez essayer le collecteur de G1Garbage Vous pouvez activer avec:

-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

+0

Si des objets sont transférés d'un thread à un autre, non seulement l'allocation de pile sera impossible, mais je suppose qu'il y aura également des problèmes avec les tampons TLAB (Thread Local Allocation Buffers). Je crois que la JVM JRockit est encore plus agressive avec son comportement de la mémoire locale. –

+0

Je ne m'attends pas à ce que l'analyse d'échappement puisse aider les acteurs * en soi *, mais il y a beaucoup d'autres conversions implicites qui se passent dans l'application sur la pile et qui pourraient être élidées. J'espérais juste faire une sorte de dent dans les frais généraux du GC! –

+0

Le problème avec G1 est qu'il est impossible d'utiliser JConsole pour voir ce qui se passe –

3

Je vous suggère d'essayer d'augmenter la nouvelle taille de génération, par exemple -XX:NewSize=96M XX:NewRatio=3. Utilisez JVisualVM (inclus dans le JDK), avec le plugin Visual GC pour voir comment les espaces jeunes et vieux sont utilisés.

+0

Oui, j'ai essayé et cela n'a fait pratiquement aucune différence. J'ai essayé des ratios allant de 1 à 4 –

6

du jdk-u18 release notes:

Notez que l'optimisation à base d'analyse Évasion (-XX: + DoEscapeAnalysis) est désactivé dans 6u18. Cette option sera restaurée dans une prochaine mise à jour de Java SE 6.

+1

Oui, il est activé par défaut dans Java 6u23 et plus tard (Voir http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7. html). –