Le 19 août, Oracle a publié le JDK 8u20. Le JDK 8u20 inclut de nombreuses nouvelles fonctionnalités, telles que les mises à jour du compilateur Java, la prise en charge de la modification des paramètres MinHeapFreeRatio et MaxHeapFreeRatio via les API au moment de l'exécution et de nouveaux documents de guide de réglage GC. Cependant, parmi les nombreuses nouvelles fonctionnalités, la plus attendue est la déduplication de chaînes. Comment réduire l'utilisation de la mémoire a toujours été un sujet éternel. Dans les applications Java, on constate souvent que l'objet String occupe 30 % de la mémoire de l'application. C'est l'un des objets les plus couramment utilisés en Java. La nouvelle fonctionnalité de déduplication de chaîne peut aider à réduire l'empreinte mémoire des objets String dans les applications. Actuellement, cette fonctionnalité n'est disponible que pour le garbage collector G1 et n'est pas activée par défaut.
Fabian Lange explique comment la déduplication de chaînes est implémentée :
Copiez le code comme suit :
Le garbage collector marquera le tableau de caractères de l'objet String lors de son accès et enregistrera la valeur de hachage de la chaîne et la référence faible dans un tableau. Lorsque le garbage collector trouve un autre objet String avec la même valeur de hachage, il compare les deux objets caractère par caractère. S'ils correspondent exactement, une chaîne sera modifiée pour pointer vers le tableau de caractères de l'autre chaîne. Le premier tableau de caractères n'étant plus référencé, il peut être recyclé. Le garbage collector tentera de réduire le coût de l'ensemble de l'opération. Par exemple, si un objet String est analysé et qu'aucun doublon n'est trouvé, il ne sera pas vérifié à nouveau dans la période suivante.
Ensuite, Fabian Lange a expliqué l'effet magique de la déduplication de chaînes via le code. Exécutez d’abord le code suivant à l’aide de Java 8 Update 20 avec les paramètres -Xmx256m -XX:+UseG1GC :
Copiez le code comme suit :
classe publique LotsOfStrings {
private static final LinkedList<String> LOTS_OF_STRINGS = new LinkedList<>();
public static void main (String[] args) lève une exception {
itération int = 0 ;
tandis que (vrai) {
pour (int je = 0; je < 100; i++) {
pour (int j = 0; j < 1000; j++) {
LOTS_OF_STRINGS.add(new String("String " + j));
}
}
itération++ ;
System.out.println("Itération survivante : " + itération);
Thread.sleep(100);
}
}
}
Le code cessera de s'exécuter en raison de l'exception OutOfMemoryError après 30 boucles. Après avoir utilisé les paramètres -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics pour activer la fonctionnalité de déduplication de chaîne, le programme peut s'exécuter pendant une période plus longue. Vous pouvez également en savoir plus sur les détails de l'ensemble du processus de déduplication via les journaux JVM. Les lecteurs sont invités à le tester eux-mêmes.
Enfin, Fabian Lange a également expliqué la différence entre la déduplication de chaîne et la résidence de chaîne. Elles sont très similaires, sauf que la résidence de chaîne réutilise l'intégralité de l'instance de String, tandis que la déduplication de chaîne ne cible que le tableau de caractères de String.
(Fin du texte intégral)