Java GC tuning pour les chaînes
Profilant l'application, j'ai compris qu'il y avait beaucoup de chaînes sur le tas.
Dans ma situation, les chaînes sont créées sur le tas et non internées et ce ne sont pas des littéraux.
Existe-t-il des techniques d'accord GC spécifiques à suivre lorsque le nombre de chaînes dans l'application est très élevé.
Je suis tombé sur les paramètres GC -XX:+UseCompressedStrings ou-XX+UseStringCache mais je ne suis pas sûr que cela aidera. N'importe quel corps a essayé ces les paramètres?
Version Java "1.6.0_22"
L'environnement d'exécution Java(TM) SE (build 1.6.0_22-b04)
Java HotSpot (TM) serveur virtuel 64 bits (build 17.1-b03, mode mixte)
2 answers
Lié à -XX:+UseCompressedStrings
, vous devriez jeter un oeil à cette question: Prise en charge des chaînes compressées en cours de suppression dans HotSpot JVM?
Et, lié à -XX+UseStringCache
, jetez un oeil à : JVM-XX:+Argument StringCache?
Btw. Java 7 est livré avec de belles fonctionnalités qui permettent de régler le cache de chaînes lors de l'utilisation des chaînes internées. Voir -XX:+PrintSTringTableStatistics
et -XX:StringTableSize=n
. De cette façon, vous pouvez optimiser la taille du cache de chaîne.
Java 8 est livré avec une nouvelle fonctionnalité GC-XX:+UseStringDeduplication.
Après avoir activé cela, GC comparerait les chaînes pour trouver celles avec la même valeur de tableau de caractères. Disons str1
& str2
avoir le même char [], alors GC ferait point str1 à char [] de str2. De cette façon, char [] de str1 peut être récupéré et récupérer la mémoire. Et puisque les chaînes sont immuables, il n'y a aucun risque de faire pointer plusieurs chaînes vers le même char []