BT

Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise

Contribuez

Sujets

Sélectionner votre région

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

Oracle ajuste la représentation interne des Strings

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

Contenu Éducatif

BT