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?
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. –
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! –
Le problème avec G1 est qu'il est impossible d'utiliser JConsole pour voir ce qui se passe –