BT

Oracle ajuste la représentation interne des Strings

| par Kaushik Pal Suivre 0 Abonnés , traduit par Simon Baslé Suivre 1 Abonnés le 09 janv. 2014. Durée de lecture estimée: 2 minutes |

Dans un effort continu d'amélioration des performances de Java, Oracle a communiqué sur un changement dans la représentation interne des chaînes de caractères dans la classe String à partir de Java 1.7.0_06 (NdT : il s'agit bien d'une communication récente sur un changement effectué dans une version déjà ancienne de la jvm).

Le changement, retirer deux champs non statiques de l'implémentation sous-jacente de String, a été effectué pour aider à la prévention de fuites mémoire.

L'implémentation précédente de String est basée sur quatre champs non statiques. Le premier est une valeur char[], qui contient les caractères constituant la chaîne. Le second est un offset entier qui garde l'index du 1er caractère dans le tableau. Le troisième est un compteur entier stockant le nombre de caractères à utiliser dans le tableau. Le quatrième enfin est le hash, qui met en cache la valeur du hashcode de la String.

Oracle a rapporté qu'un problème de performance pouvait se déclarer dans l'implémentation originelle quand une String est créée par un appel à String.substring(). Substring() est appelé en interne par beaucoup d'autres appels de l'API comme Pattern.split(). Quand cette méthode est appelée, elle se réfère à la valeur interne char[] des caractères de la chaîne d'origine.

L'implémentation précédente était conçue de cette manière afin d'induire des gains de mémoire, puisque la sous-chaîne faisait référence aux données des caractères originaux. De plus, String.substring() s'exécutait en temps constant (O(1)) contrairement à la nouvelle implémentation qui s'exécute maintenant en temps linéaire (O(n)).

Cependant l'ancienne implémentation a la possibilité de produire une fuite mémoire dans les cas où l'application réaliserait une extraction de petite chaîne à partir d'une grand chaîne et jetterait ensuite la String originale. Dans un tel scénario, une référence vivante au tableau de char[] de la chaîne originale reste en mémoire, gardant potentiellement beaucoup d'octets de données inutiles.

Pour éviter cette situation dans les anciennes versions, Oracle suggère d'appeler le constructeur new String(String) sur la petite chaîne. Cette API copie seulement la section requise du tableau de char[] sous-jacent, déliant de par ce fait la petite chaîne de la grosse String parente d'origine.

Dans le nouveau paradigme, les champs d'offset et de compteur de String on été retirés, de sorte que les sous-chaînes ne partagent plus la valeur char[] sous-jacente à la chaîne d'origine.

Evaluer cet article

Pertinence
Style

Bonjour étranger!

Vous devez créer un compte InfoQ ou cliquez sur pour déposer des commentaires. Mais il y a bien d'autres avantages à s'enregistrer.

Tirez le meilleur d'InfoQ

Donnez-nous votre avis

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet
Commentaires de la Communauté

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet

Discuter

Se connecter à InfoQ pour interagir sur ce qui vous importe le plus.


Récupérer votre mot de passe

Follow

Suivre vos sujets et éditeurs favoris

Bref aperçu des points saillants de l'industrie et sur le site.

Like

More signal, less noise

Créez votre propre flux en choisissant les sujets que vous souhaitez lire et les éditeurs dont vous désirez suivre les nouvelles.

Notifications

Restez à jour

Paramétrez vos notifications et ne ratez pas le contenu qui vous importe

BT