BT

Accueil InfoQ Actualités Oracle ajuste la représentation interne des Strings

Oracle ajuste la représentation interne des Strings

Favoris

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

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

Commentaires de la Communauté

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

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

BT

Votre profil est-il à jour? Merci de prendre un instant pour vérifier.

Note: en cas de modification de votre adresse email, une validation sera envoyée.

Nom de votre entreprise:
Rôle dans votre entreprise:
Taille de votre entreprise:
Pays/Zone:
État/Province/Région:
Vous allez recevoir un email pour confirmer la nouvelle adresse email. Ce pop-up va se fermer de lui-même dans quelques instants.