7
votes

Expériences avec analyse d'évasion activée sur la JVM

Je viens d'essayer l'option -xx: + decapeanalyse activé sur un JDK6-U18 vm (sur Solaris) et a eu une expérience plutôt décevante. Je gère une application Scala qui a plutôt beaucoup d'acteurs (20 000 d'entre eux). Ceci est une recette de création des ordures!

Généralement, l'application peut fonctionner avec 256 Mo de tas, mais génère énormes énormes des ordures. Dans son State State IT:

  • dépense 10% de temps dans GC
  • génère> 150 Mo de déchets dans <30S qui obtient alors GC'D

    Je pensais que cette analyse d'évacuation pourrait vous aider, donc j'ai activé l'option et réaffecter l'application. J'ai constaté que l'application est devenue de plus en plus incapable de dégager la poubelle qu'elle avait collectée jusqu'à ce qu'elle semblait éventuellement à dépenser le tout le temps faire du GC et que l'application était "Flatlining" à sa répartition complète.

    À ce stade, je devrais dire que l'application n'a pas lancé un OutofMemoryError que j'aurais attendu. Peut-être que jconsole (que j'utilisais pour effectuer l'analyse) n'affiche pas correctement les statistiques GC avec cette option (je ne suis pas convaincu)?

    J'ai ensuite supprimé l'option et redémarré et l'application est devenue "normale" à nouveau! Quelqu'un a une idée de ce qui pourrait se passer?


0 commentaires

3 Réponses :


8
votes

1 L'analyse d'évasion s'est-elle présentée comme étant 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 que je vérifiais.

2 Je ne pense pas que l'analyse d'évasion aidera la situation avec des acteurs Scala. Vous pouvez voir un gros gain si vous faites quelque chose comme: xxx

dans l'exemple ci-dessus le rendrait si omhugeObject pourrait être attribué sur le pile au lieu du tas et donc ne pas créer des ordures. Je ne pense pas qu'il est probable que l'analyse d'évasion aidera avec les acteurs. Leurs références "échapperont toujours" au sous-système Acteur.

3 Êtes-vous sur la dernière version de Scala? Il y avait une fuite de mémoire que je crois était corrigée dans une version récente. Cela a même causé Soulevard pour émerger sa propre bibliothèque d'acteur que vous pourriez examiner.

< Strong> 4 Vous pouvez essayer le collecteur G1GARGAGE que vous pouvez l'activer avec:

-xx: + Unlockexperimentalvmoptions -XX: + UtilisationG1GC


7 commentaires

Si ce sont des objets transférés d'un thread à un autre, non seulement l'allocation de pile sera impossible, je suppose que les tampons d'allocation locaux de fil (TLAB) seront également abordés. Je crois que la JRockit JVM est encore plus agressive avec son comportement de mémoire du fil-local.


Je ne m'attends pas à ce que l'analyse d'évacuation puisse aider avec les acteurs en soi , mais il y a beaucoup d'autres conversions implicites sur l'application sur la pile qui pourrait être élue. J'espérais juste faire une sorte de dent dans les frais généraux de GC!


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


Oui - L'analyse du tas a été activée. Je n'ai pas besoin -Server parce que je cours sur un monstre Solaris afin que la JVM soit un serveur un par défaut. Oui, j'utilise Scala 2.7.7.


J'accepte la réponse parce que je pense maintenant que quelque chose d'autre se passe; Je vais poser une question distincte


L'analyse d'évacuation a été désactivée: Stackoverflow.com/Questtions/2179830/...


Essayez jdk6u21. L'analyse d'évacuation a été rééditée



3
votes

Je vous suggère d'essayer d'augmenter la taille de la nouvelle génération, par ex. -xx: Newsize = 96m xx: newratio = 3 . Utilisez Jvisalvm (inclus dans la JDK), avec le Plugin Visual GC pour voir comment le Les jeunes et anciens espaces sont utilisés.


1 commentaires

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



6
votes

du Notes de publication JDK-U18 :

Notez que l'optimisation de l'analyse d'échappement (-XX: + DoScapeanalyse) est désactivée en 6U18. Cette option sera restaurée dans une future mise à jour Java SE 6.


1 commentaires

Oui, c'est activé par défaut dans Java 6U23 et plus tard (voir docs.oracle.com/javase/7/docs/technotes/guides/vm/... ).