D'où Java est constante Chaîne pool live, le tas ou de la pile?
Je sais que le concept de l'une des constantes de la piscine et de la constante de Chaîne piscine utilisée par les machines virtuelles gérer les littéraux de Chaîne. Mais je ne sais pas quel type de mémoire est utilisé par la JVM pour stocker Chaîne de caractères littéraux. La pile ou le tas? Depuis sa un littéral qui n'est associée à aucune instance, je suppose qu'elle sera stockée dans la pile. Mais si elle n'est pas visée par une instance de la lettre doit être recueillis par GC run (corrigez-moi si je me trompe), donc comment est traitée si elle est stockée dans la pile?
- Comment un pool d'être stockées sur la pile? connaissez-vous le concept d'une pile?
- Salut Mêlée Meister, j'ai essayé de dire qu'il ne peut pas être. Désolé pour le mauvais convention. Concernant GC, Juste maintenant, je suis venu à connaître. Merci pour cette
- en fait, dans certaines circonstances, ils peuvent être nettoyés. Le "deal breaker" est que le code objet pour toute la classe qui mentionne un littéral de chaîne aura une référence à l'objet de type String qui représente le littéral.
Vous devez vous connecter pour publier un commentaire.
La réponse est techniquement ni. En fonction de la Machine Virtuelle Java de la Spécification, de la zone pour le stockage des littéraux de chaîne est dans le constante d'exécution de la piscine. La constante d'exécution de la piscine zone de mémoire est allouée par classe ou par interface de base, il n'est donc pas liée à une des instances de l'objet à tous. La constante d'exécution de la piscine est un sous-ensemble de la méthode de la zone qui "stocke par la classe des structures telles que la constante d'exécution de la piscine, le terrain et les données de la méthode, et le code pour les méthodes et les constructeurs, y compris les méthodes utilisées en classe et d'instance d'initialisation et de type d'interface d'initialisation". La VM spec dit que, bien que la méthode de la zone est logiquement partie du tas, il n'est pas dicter que la mémoire allouée dans la méthode de la zone soumise à la collecte des déchets ou d'autres comportements qui seraient associés à la normale des structures de données allouées au segment de mémoire.
Comme l'a expliqué cette réponse, l'emplacement exact de la chaîne de la piscine n'est pas spécifiée et peut varier d'une JVM mise en œuvre à l'autre.
Il est intéressant de noter que jusqu'en Java 7, la piscine était dans le permgen space du tas sur la JVM hotspot mais elle a été déplacée dans la partie principale de la tas depuis Java 7:
Et dans Java 8 Hotspot, de Génération Permanente a été complètement enlevé.
Littéraux de chaîne ne sont pas stockées sur la pile.
Littéraux de chaîne (ou, plus précisément, la Chaîne des objets qui les représentent)
sontont été historiquement stockées dans un Tas appelé le "permgen" tas. (Permgen est court pour la génération permanente.)Dans des circonstances normales, les littéraux de Chaîne et beaucoup d'autres choses dans le permgen tas sont "définitivement" accessible, et ne sont pas des ordures collectées. (Par exemple, les littéraux de Chaîne sont toujours joignables par le code des objets qui les utilisent.) Toutefois, vous pouvez configurer une machine virtuelle java pour tenter de trouver et de recueillir chargement dynamique des classes qui ne sont plus nécessaires, ce qui peut causer des littéraux de Chaîne pour être nettoyée.
CLARIFICATION #1 - je ne dis pas que la Permgen ne pas obtenir GC ed. Il n'est, en général, lorsque la JVM décide d'exécuter un GC. Mon point est que la Chaîne littéraux sera accessible tant que le code qui les utilise est accessible, et le code sera accessible tant que le code du chargeur de classe est accessible, et pour la valeur par défaut chargeurs de classes, qui signifie "pour toujours".
CLARIFICATION #2 - En fait, Java 7 magasins stagiaire avais Chaîne objets ordinaires dans le Tas. Cela comprend (je présume) objet Chaîne de caractères qui représentent les littéraux de Chaîne. (Voir @assylias la Réponse pour plus de détails.)
Chaîne de mise en commun
Chaîne.stagiaire() en Java 6
Chaîne.stagiaire() en Java 7
De la chaîne de valeurs du pool sont des ordures collectées
source.
Comme d'autres réponses expliquer la Mémoire en Java est divisé en deux parties
1. Pile: Une pile est créé par thread et les magasins de la pile des cadres qui, là encore, les magasins de variables locales et si une variable est un type de référence, alors que la variable se rapporte à un emplacement de mémoire dans le tas pour l'objet réel.
2. Tas: Toutes sortes d'objets seront créés dans le tas seulement.
De segment de mémoire est à nouveau divisé en 3 parties
1. La jeune Génération: Stocke des objets qui ont une vie courte, les Jeunes de la Génération elle-même peut être divisée en deux catégories Eden Espace et Survivant de l'Espace.
2. La vieille Génération: Stocker des objets qui ont survécu à de nombreuses collecte des ordures cycles et encore référencée.
3. Génération permanente: Stocke les métadonnées sur le programme d'exécution de la constante de la piscine.
Constante de chaîne piscine appartient à la génération permanente de la zone de mémoire dans la mémoire.
Nous pouvons voir la constante d'exécution de la piscine pour notre code dans le bytecode en utilisant
javap -verbose class_name
qui va nous montrer la méthode de référence (#Methodref), les objets de la Classe ( #Classe ), les littéraux de chaîne ( #Chaîne de caractères )Vous pouvez en lire plus à ce sujet sur mon article Comment JVM Gérer la Surcharge de Méthode et dominante en Interne.
À la grande réponses que déjà inclus ici, je tiens à ajouter quelque chose qui manque à mon point de vue - une illustration.
Comme vous l'avez déjà JVM divise la mémoire allouée à un programme Java en deux parties. on est pile et un autre est tas. Pile est utilisée pour l'exécution de but et le segment est utilisé pour le stockage but. Dans ce segment de la mémoire, de la JVM alloue de la mémoire spécialement conçus pour les littéraux de chaîne. Cette partie de la mémoire de masse est appelée constantes de chaîne piscine.
Ainsi, par exemple, si vous initialiser les objets suivants:
Littéraux de chaîne
s1
ets2
va aller à la constante de chaîne de la piscine, des objets obj1, obj2, obj3 le tas. Tous d'entre eux, va être référencé à partir de la Pile.Aussi, veuillez noter que "abc" apparaîtra dans le tas et en constante chaîne de la piscine. Pourquoi est -
String s1 = "abc"
etString obj1 = new String("abc")
seront créés de cette façon? C'est parce queString obj1 = new String("abc")
explicitement crée une nouvelle et referentially distinctes instance d'un objet de type String etString s1 = "abc"
peut réutiliser une instance à partir de la constante de chaîne de la piscine si l'on est disponible. Pour une description plus détaillée explication: https://stackoverflow.com/a/3298542/2811258