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.
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";
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";
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.
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.
1. Concaténation au moment de la compilation (optimisation avec des littéraux)
String string5 = "This" + "String";
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
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";
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";
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.
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.
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!