Quand une chaîne être le garbage collector de java
En Java, quand un objet a pas de référence, il est admissible pour la collecte des ordures. Maintenant, dans le cas d'une chaîne de caractères, ce n'est pas le cas parce que la chaîne va aller dans la chaîne de la piscine et de la JVM va garder l'objet en vie pour resuse.
Cela signifie donc que si une chaîne de caractères une fois créé, sera "jamais" être nettoyée?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, il est seulement chaîne littéraux (voir les notes) qui obtiennent automatiquement internés /ajoutée à la chaîne de la piscine.
String
les objets qui sont créés par une application lors de l'exécution ne sont pas internés ... à moins que votre application appelle explicitementString.intern()
.Second, en fait, les règles pour les ordures ménagères la collecte des objets dans la chaîne de la piscine sont les mêmes que pour les autres
String
objets: en effet tous les objets. Ils seront les ordures sont collectées que si jamais ils deviennent inaccessibles.Dans la pratique, la
String
des objets qui correspondent à des littéraux de chaîne généralement ne deviennent pas des candidats pour la collecte des ordures. C'est parce qu'il est un implicite référence à laString
objet dans le code de chaque méthode qui utilise le littéral. Cela signifie que leString
est accessible aussi longtemps que la méthode pourrait être exécuté.Cependant, ce n'est pas toujours le cas. Si une chaîne de caractères littérale a été définie dans une classe qui était chargé dynamiquement (par exemple à l'aide de
Class.forName(...)
), alors il est possible de faire en sorte que la classe est déchargé. Si cela arrive, alors laString
objet correspondant à la traduction littérale peut alors être inaccessible, et peut-être en fin de compte GC ed.Notes:
Un littéral de chaîne (JLS 3.10.5) est une chaîne qui s'affiche dans le code source de Java; par exemple,
Une chaîne produite par l'évaluation de (au moment de la compilation) expression constante (JLS 15.28) peut également être interné.
À proprement parler, pas tous les littéraux de Chaîne sont internés. Si un littéral de Chaîne n'apparaît que dans le code source comme une sous-expression d'une expression constante, alors la traduction littérale ne peut pas apparaître dans le ".la classe" fichier dans toute forme. Un tel littéral ne sera pas interné, car il n'existe pas au moment de l'exécution.
Vous sont correctes; les chaînes dans la stagiaire de la piscine ne sera jamais GC avais.
Cependant, la plupart des chaînes de pas interné.
Chaîne littéraux sont internés, et les chaînes transmises à
String.intern()
sont internés, mais toutes les autres chaînes ne sont pas internés et peut être GC feriez normalement.new
ne sera pas interné. L'objet de type String qui représente la chaîne de caractères littérale est être interné.