Principe de String.intern
dans JDK6 Le pool de constantes dans Jdk6 est situé dans PermGen (génération permanente)String.intern():
String.intern()
Cette méthode est une méthode native
La méthode sous-jacente est implémentée en appelant StringTable de C++ : :intern method
Lorsque la méthode intern() est appelée via l'instruction str.intern()
La JVM recherchera dans le pool constant de la classe actuelle pour voir s'il y a une chaîne avec la même valeur que str
Si Si elle existe, la référence du Strnig correspondant dans le pool constant sera directement renvoyée
Si elle n'existe pas, une String équivalente sera créée dans le pool constant # 🎜🎜# puis la référence de cette String dans le pool constant sera renvoyée
- ---------------------------- ---------------------- ------------
Par conséquent, tant qu'ils sont des objets String équivalents#🎜 🎜#, l'utilisation de la méthode intern() renvoie la même référence String dans le pool de constantes
Ainsi, ces objets String équivalents peuvent être mis en correspondance en utilisant == après intern()
PermGen est une zone de taille fixe principalement utilisée pour stocker les informations de classe chargées et piscine à cordesJdk7 a déplacé le pool de constantes de la zone PermGen vers Java. zone de tas#🎜 🎜# Lors de l'exécution d'une opération interne--------- ---------------------------------- ---------------- --------------
Tout d'abord, PermGen est une zone de taille fixe Généralement, la taille par défaut de PermGen est différente selon les plateformes, ce n'est pas la même non plus,
Lors de l'exécution de la méthode intern()
Quand il n'y a pas d'équivalent chaîne dans le pool constant, la JVM créera une chaîne équivalente dans le pool constant La chaîne de valeur
puis renvoie une référence à la chaîne
De plus, la JVM enregistrera automatiquement un ensemble de valeurs précédentes. chaînes utilisées dans le pool constant
Utiliser la méthode interne (dans Jdk6) signifie que le pool constant est enregistré dans PermGen (génération permanente)
Notes :est environ entre 32M et 96M.
String.intern() dans JDK7
Par conséquent, vous ne pouvez pas utiliser la méthode intern() pour les chaînes d'exécution non contrôlées (telles que les informations saisies par l'utilisateur, etc.),
Sinon, cela risque de provoquer un débordement de mémoire PermGen
Deuxièmement, l'objet String est enregistré Dans la zone de tas Java, la zone de tas Java et PermGen sont physiquement isolés,
Par conséquent, si des opérations internes sont effectuées sur plusieurs objets chaîne inégaux,
entraînera de nombreuses chaînes en double dans le mémoire. , entraînera une perte de performances
Lorsque la chaîne existe déjà dans le pool constant, la référence de chaîne est renvoyée directementSinon, la référence de l'objet chaîne est copiée dans le pool constant et renvoyée
Zone de tas La taille n'est généralement pas limitée, donc déplacer le pool constant de la zone PremGen vers la zone de tas rend l'utilisation du pool constant non limitée à une taille fixe
De plus, les objets dans le pool constant situé dans la zone de tas peut être un déchet Recyclage
Lorsque la chaîne dans le pool constant n'a plus de référence, la JVM recyclera la chaîne
Vous pouvez utiliser la machine virtuelle -XX:StringTableSize paramètre pour définir la taille de la carte du pool de chaînes#🎜 🎜# Le pool de chaînes est implémenté en interne sous forme de HashMap
Ainsi, lorsque vous pouvez déterminer le nombre de chaînes qui ont besoin d'être internes dans le programme
Vous pouvez définir le taille de la carte au nombre requis*2 (réduire les conflits de hachage)# 🎜🎜# Cela permet à String.intern() de nécessiter uniquement un temps constant et
une mémoire assez petite pour stocker une chaîne dans le pool de chaînes #🎜🎜 # Méthode String.intern() Fonction :
Sa fonction est de mettre manuellement la chaîne dans le pool de constantes
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!