Maison > Java > javaDidacticiel > Chaînes : garbage collection et immuabilité en Java

Chaînes : garbage collection et immuabilité en Java

DDD
Libérer: 2024-11-07 08:13:03
original
767 Les gens l'ont consulté

Strings: Garbage Collection and Immutability in Java

En Java, les chaînes jouent un rôle unique dans la gestion de la mémoire en raison de leurs caractéristiques immuabilité et internement. Ces concepts améliorent non seulement les performances, mais introduisent également des nuances dans la gestion de la mémoire qui sont souvent essentielles lors des entretiens.

Explorons en profondeur le Garbage Collection et l'Immuabilité, avec des notes sur la manière dont le pool de chaînes et la gestion de la mémoire JVM interagissent avec ces concepts.

Cet article s'appuie sur les concepts abordés dans l'article précédent sur le pool de chaînes et la gestion de la mémoire. La lecture préalable de cet article fournira une base utile pour comprendre les sujets abordés ici.


1. Collecte des déchets à cordes

En Java, les chaînes littérales se comportent différemment en termes de garbage collection (GC).

1. Littéraux non référencés dans le pool de chaînes

String string3 = "World"; // Stored in String Pool

// A new string is created in the pool due to case-sensitivity
string3 = "WORLD";
Copier après la connexion
Copier après la connexion
  • Dans cet exemple, le « Monde » d'origine est toujours dans le pool de chaînes, même si la chaîne 3 est réaffectée.

  • La JVM conserve les littéraux non référencés dans le pool, permettant une réutilisation future, mais ces littéraux ne sont PAS soumis au garbage collection comme les objets de tas ordinaires.

2. Tas d'objets

String str1 = new String("World"); // Stored in Heap

// String Pool reference is used now
// leaving the previous "World" eligible for GC in Heap
str1 = "WORLD";
Copier après la connexion
Copier après la connexion
  • Lorsqu'elle est créée avec new, une chaîne va dans le heap au lieu du String Pool.

  • Si la référence change, comme avec str1, la chaîne "World" inutilisée dans le tas peut être récupérée car elle n'est plus référencée.


2. Immuabilité des chaînes

Les chaînes en Java sont immuables : une fois créées, elles ne peuvent pas être modifiées. Toute « modification » entraîne la création d'un nouvel objet chaîne plutôt que de changer celui existant.

Effets pratiques de l'immuabilité

1. Concaténation au moment de la compilation (optimisation avec des littéraux)

   String string5 = "This" + "String";
Copier après la connexion
  • Lors de la concaténation de littéraux, le compilateur Java optimise en effectuant la concaténation au au moment de la compilation.

  • La chaîne résultante ("ThisString") est directement stockée dans le String Pool, évitant ainsi entièrement le tas.

  • Ce processus est également connu sous le nom de Pliage constant de la piscine.

2. Concaténation d'exécution (pas d'optimisation)

   String string1 = "Hello";
   string1 = string1 + "Hello"; // Stored in Heap
Copier après la connexion
  • Lorsque un ou plusieurs opérandes sont des variables (non littérales), la concaténation se produit au exécution, ce qui donne lieu à un objet de tas qui ne réside pas dans le pool de chaînes. .

  • Exemple : Le littéral "Hello" d'origine reste dans le pool, tandis que la chaîne "HelloHello" concaténée est stockée dans le tas, confirmant l'immuabilité du "Hello" d'origine.

3. Utilisation de la méthode concat()

String string3 = "World"; // Stored in String Pool

// A new string is created in the pool due to case-sensitivity
string3 = "WORLD";
Copier après la connexion
Copier après la connexion
  • La méthode concat() effectue toujours une concaténation runtime, en plaçant la nouvelle chaîne dans le heap, que les opérandes soient des littéraux ou des variables.

4. Application de la méthode stagiaire()

String str1 = new String("World"); // Stored in Heap

// String Pool reference is used now
// leaving the previous "World" eligible for GC in Heap
str1 = "WORLD";
Copier après la connexion
Copier après la connexion

Processus :

  • Tout d'abord, l'opération concat() crée une nouvelle chaîne dans le heap avec la valeur "Le monde dit bonjour", à laquelle string3 fait initialement référence.

  • Lorsque nous appelons intern(), il vérifie si cette valeur est déjà dans le String Pool. Sinon, il ajoute la valeur au pool et renvoie une référence à cette instance regroupée.

  • Après avoir appelé intern(), string3 pointe vers la copie regroupée de la chaîne. L'instance de tas d'origine, désormais sans aucune référence active, devient éligible au garbage collection, réduisant ainsi l'utilisation inutile de la mémoire.


Résumé des points clés

  • Optimisation du pool de chaînes : le pool de chaînes est crucial pour économiser de la mémoire en réutilisant les littéraux.
  • Immuabilité : L'immuabilité rend les chaînes sûres et fiables, mais peut entraîner la création d'objets de tas supplémentaires lors de la modification de chaînes.
  • Garbage Collection : les littéraux non référencés dans le pool ne sont pas récupérés, mais les chaînes inutilisées basées sur le tas le sont.

En comprenant et en exploitant ces principes, les développeurs Java peuvent écrire du code plus efficace et plus performant en matière de mémoire.


Articles connexes

  • Principes fondamentaux de Java
  • Les essentiels de l'entretien avec Array
  • L'essentiel de la mémoire Java
  • L'essentiel des mots-clés Java
  • L'essentiel de Java OOP
  • L'essentiel du cadre de collections

Bon codage !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal