Prise en charge des chaînes compressées en cours de suppression dans JVM HotSpot?

Sur cette page Oracle Java HotSpot Options VM , il répertorie -XX:+UseCompressedSsortingngs comme étant disponible et -XX:+UseCompressedSsortingngs par défaut. Cependant, dans Java 6 Update 29, il est désactivé par défaut et dans Java 7 Update 2, il signale un avertissement.

 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseCompressedSsortingngs; support was removed in 7.0 

Est-ce que quelqu’un connaît la pensée derrière la suppression de cette option?


lignes de sorting d’un énorme fichier.txt en java

Avec -mx2g , cet exemple a pris 4,541 secondes avec l’option activée et 5,206 secondes avec Java 6 update 29. Il est difficile de voir que cela affecte les performances.

Remarque: la mise à jour Java 7 nécessite 2,0 G, tandis que la mise à jour Java 6 29 sans chaînes compressées nécessite 1,8 Go et avec la chaîne compressée, elle ne nécessite que 1,0 Go.

À l’origine, cette option a été ajoutée pour améliorer les performances de SPECjBB. Les gains sont dus à la réduction des besoins en bande passante mémoire entre le processeur et la DRAM. Charger et stocker des octets dans l’octet [] consum 1/2 de la bande passante par rapport aux caractères du caractère [].

Cependant, cela a un prix. Le code doit déterminer si le tableau interne est un octet [] ou un char []. Cela prend du temps processeur et si la charge de travail n’est pas limitée par la bande passante de la mémoire, elle peut entraîner une régression des performances. Il y a aussi un prix de maintenance du code en raison de la complexité supplémentaire.

Étant donné qu’il n’y avait pas suffisamment de charges de travail de type production présentant des gains significatifs (sauf peut-être SPECjBB), l’option a été supprimée.

Il y a un autre angle à cela. L’option réduit l’utilisation du tas. Pour les chaînes applicables, l’utilisation de la mémoire de ces chaînes est réduite de 1/2. Cet angle n’a pas été pris en compte lors de la suppression de l’option. Pour les charges de travail limitées par la capacité de la mémoire (par exemple, avoir un espace de stack limité et que le GC prend beaucoup de temps), cette option peut s’avérer utile.

Si suffisamment de capacité de mémoire limitée par des charges de travail de type production peut justifier l’inclusion de l’option, alors peutêtre l’option sera-t-elle rétablie.

Edit 20/03/2013: Un vidage de tas de serveur moyen utilise 25% de l’espace sur les chaînes. La plupart des chaînes sont compressibles. Si l’option est réintroduite, cela pourrait économiser la moitié de cet espace (par exemple ~ 12%)!

Edit 10/03/2016: Une fonctionnalité similaire aux chaînes compressées revient dans JDK 9 JEP 254 .

Comme il y avait des votes, je me suis rendu compte que je ne manquais pas de quelque chose d’évident, donc je l’ai enregistré comme un bogue (à tout le moins une omission dans la documentation)

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7129417

(Devrait être visible dans quelques jours)

Juste pour append, pour ceux intéressés …

L’interface java.lang.CharSequence (que java.lang.Ssortingng implémente) permet des représentations plus compactes des chaînes que UTF-16.

Les applications qui manipulent beaucoup de chaînes devraient probablement être écrites pour accepter CharSequence , de sorte qu’elles fonctionneraient avec des représentations java.lang.Ssortingng ou plus compactes .

Les chaînes codées sur 8 bits (UTF-8) ou même sur 5, 6 ou 7 bits, ou même compressées, peuvent être représentées sous CharSequence de CharSequence .

CharSequence s peut également être beaucoup plus efficace à manipuler – les sous-séquences peuvent être définies comme des vues (pointeurs) sur le contenu d’origine, par exemple, au lieu de copier.

Par exemple, dans les arborescences concurrentes , une arborescence de suffixes de dix pièces de Shakespeare nécessite 2 Go de RAM en utilisant des nœuds basés sur CharSequence et nécessite 249 Go de RAM si vous utilisez des nœuds char [] ou Ssortingng.

Java 9 exécute les lignes de sorting d’un énorme fichier.txt dans Java deux fois plus vite sur ma machine que Java 6 et n’a besoin que de 1 Go de mémoire car -XX:+CompactSsortingngs activé par défaut. De plus, dans Java 6, les chaînes compressées ne fonctionnaient que pour les caractères ASCII 7 bits, alors que dans Java 9, elles supportaient Latin1 (ISO-8859-1). Certaines opérations comme charAt(idx) peuvent être légèrement plus lentes. Avec le nouveau design, ils pourraient également prendre en charge d’autres encodages à l’avenir.

J’ai écrit une newsletter à ce sujet sur la Newsletter des spécialistes de Java .

Dans OpenJDK 7 (1.7.0_147-icedtea, Ubuntu 11.10), la JVM échoue simplement avec un

Option VM non reconnue ‘UseCompressedSsortingngs’

lorsque JAVA_OPTS (ou ligne de commande) contient -XX:+UseCompressedSsortingngs .

Il semble qu’Oracle ait vraiment supprimé l’option.