La chaîne occupe une grande quantité de mémoire dans n'importe quelle application. En particulier, le tableau char [] contenant le caractère indépendant UTF-16 contribue le plus à la consommation de mémoire JVM en raison de chaque caractère occupe 2 chiffres.
30% de la mémoire est en fait très courante. À l'aide de la mise à jour Java 8, nous pouvons maintenant contacter une nouvelle fonctionnalité, appelée une chaîne pour devenir lourde.
La chaîne est réutilisée pour ré-utiliser l'interne de la chaîne est en fait le tableau char et la fonctionnalité de la finale, afin que JVM puisse les manipuler arbitrairement.
Le développeur considère de nombreuses stratégies pour la chaîne de chaîne, mais l'implémentation finale est utilisée dans la mise en œuvre finale:
Chaque fois que le périphérique de récupération des ordures accède à l'objet String, il marquera le tableau char. Il a obtenu la valeur de hachage du tableau char et l'existant avec une faible référence au tableau. Tant que les ordures Recyrior trouvent une autre chaîne, et cette chaîne et le réseau char ont le même code de hachage, les deux sont comparés à un caractère et à un caractère.
S'ils correspondent, une chaîne sera modifiée, pointant vers le tableau char de la deuxième chaîne. Le premier réseau de char n'est plus cité, il peut donc être recyclé.
Bien sûr, tout ce processus apporte des dépenses, mais il est contrôlé par une limite supérieure très serrée. Par exemple, si un caractère ne se révèle pas, il ne sera plus vérifié pendant une période de temps.
Alors, comment fonctionne cette fonctionnalité? Tout d'abord, vous devez simplement libérer la mise à jour Java 8 20, puis suivre cette configuration: -xmx256m -xx: + useg1gc pour exécuter le code suivant:
Classe publique lotsofStrings {private statique final likedlist <string> lots_of_strings = new linkedlist <) (); J = 0; J <1000; J ++) {LOTS_OF_STRINGS.ADD (New String (String "+ J); );}}}
Ce code sera signalé à OutofMemoryerror après 30 itérations.
Maintenant, ouvrez la chaîne pour aller lourder, utilisez la configuration suivante pour exécuter le code ci-dessus:
-Xmx256m -xx: + useg1gc -xx: + usestringDeduplication -xx: + printStringuplicationStator
À l'heure actuelle, il peut fonctionner plus longtemps et cela ne se terminera qu'après 50 itérations.
JVM a également imprimé ce qu'il a fait, jetons un coup d'œil:
[GC simultante-string-deduplication, 4658.2k-> 0,0b (4658,2k), avg 99,6%, 0,0165023 sec] [Dernier exécution: 0,0165023 sec, inactif: 0,0953764 Secs: Bloqué: 0 / 0,0000000] [Inspectd: 119538] [SKIPPD: 0 (0,0%)] [Hashed: 119538 (100,0%)] [connu: 0 (0,0%)] [Nouveau: 119538 (100,0%) 4658,2k] [Dedupliked: 119538 (100,0%) 4658.2k (100,0 .0.0] [Young: 372 (0,3%) 14,5k (0,3%)] [Ancien: 119166 (99,7%) 4643,8K (99,7%)] [Exécutif total: 4 / 0,0802259 SEC, inactif: 4 / 0,6491928 Secs, bloqué : 0 / 0,0000000 Secs] [inspecté: 557503] [Saussé: 0 (0,0%)] [hachée: 556191 (99,8%)] [connu: 903 (0,2%)] [Nouveau: 556600 (99,8%) 21,2M] [ Dedupliqué: 554727 (99,7%) 21,1 m (99,6%)] [Young: 1101 (0,2%) 43,0k (0,2%)] [Old: 553626 (99,8%) 21,1 m (99,8%)] [Tableau] [Utilisation de la mémoire : 81.1k] [Taille: 2048, Min: 1024, Max: 1677216] [Entrées: 2776, chargement: 135,5%, mise en cache: 0, ajouté: 2776, supprimé: 0] [Redimensionner le nombre: 1, rétractable trois: 13 65 (65 (66,7%), Seuil de croissance: 4096 (200,0%)] [Rehash Count: 0, Rehash Seuil: 120, Hash Seed: 0x0] [Seuil d'âge: 3] [File] [Dropped: 0]
Pour plus de commodité, nous n'avons pas besoin de calculer l'ajout de toutes les données par nous-mêmes, et il suffit de l'utiliser facilement.
Le segment de code ci-dessus stipule que la chaîne est atteinte lourde.
Les fonctionnalités ci-dessus viennent d'être lancées, ce qui signifie qu'elle peut ne pas être examinée de manière exhaustive.具体的数据在实际的应用中可能看起来有差别 , 尤其是那些应用中字符串被多次使用和传递 , 因此一些字符串可能被跳过或者早就有了 HashCode (正如你可能知道的那样 , Un code de hachage de chaîne a été chargé paresseusement).
Dans les cas ci-dessus, toute la chaîne est lourde et 4,5 Mo de données sont supprimées en mémoire.
[Tableau] Une partie des informations statistiques sur le tableau de suivi interne est donnée.
Alors, quelle est la différence entre la pondération des cordes et la résidence des cordes? En fait, la chaîne en dépend est similaire à la résidence.
La controverse du créateur de la proposition d'amélioration JDK 192 est que les développeurs ne savent souvent pas où mettre la chaîne résidente est appropriée, ou elle est cachée par le cadre. du pays), vous avez besoin d'un bon sens.
Lorsque la chaîne reste dans le fil d'application, lorsque la récupération des ordures est asynchrone et transmise, les chaînes n'augmentent pas la consommation pendant l'exécution. Il ajoute trop de pression à GC, afin que la chaîne ne se produise pas du tout.