Démarrage rapide de machine virtuelle Java

système Présentation de l'architecture machine virtuelle Java

  1. Machine virtuelle Java est en cours d'exécution, et il n'a pas Interagir directement au-dessus du système d'exploitation du matériel.
    Insérer ici l'image Description
  2. l'architecture JVM figure:
    Insérer ici l'image Description
  3. chargeur de classe
    (1) mécanisme de chargement de classe: les données de la machine virtuelle qui décrit les classes chargées à partir de fichiers .class dans la mémoire, et vérifier les données, et convertit l' initialisation, l' analyse syntaxique de formation de type Java peut être utilisé comme une machine virtuelle.
    (2) la procédure de chargement de classe:
    Insérer ici l'image Description
  • Charge: Charger le contenu des fichiers de classe bytecode dans la mémoire, et convertir le contenu dans la zone de procédé , la
    structure de données de temps d'exécution; la génération dans la mémoire représente objet java.lang.Class de cette classe, en tant que méthode de données par secteurs entrée d'accès
  • Validation: veiller à ce que le contenu des spécifications de la conformité des octets de fichier de classe, et ne compromettront pas leur sécurité jvm
    plein.
  • Préparation: officiellement attribué en tant que variables de classe (variables statiques) de l' espace de mémoire, et initialiser (la valeur par défaut est affectée une variable statique
    valeur), la zone de mémoire dans le procédé de variables statiques allouées.
  • Analyse: piscine VM constante de références symboliques au processus de remplacement des références directes.
    Par exemple String = « La aaa », dirigé vers l' adresse s « aaa » à l' adresse
  • Initialisation: l'achèvement de l'initialisation des variables statiques et d'autres ressources conformément aux procédures établies par les programmeurs de plans subjectifs de. Dans ce processus sera terminé missions et déclaration bloc de code statiques variables statiques.
  1. chargeur de classe (ClassLoader)
    classe de chargeur (1.): Le processus de chargement de classes pour mettre en oeuvre l'étape de chargement, responsable du chargement des fichiers de classe de bytecode dans le contenu de la mémoire, et convertir le contenu dans la structure de données d' exécution dans la zone de procédé , générer en mémoire représente objet java.lang.Class de cette classe, comme une méthode d'accès par zone à l' entrée de données.
    Insérer ici l'image Description
    (2) classloading Catégorie:
  • machine virtuelle classe chargeur est livré avec
    la classe de boot loader: la langue C, est responsable du chargement du contenu de% JAVA_HOME% / jre / lib / rt.jar l'
    extension de chargeur de classe: langage Java, est responsable du chargement% JAVA_HOME% / jre / lib /ext/*.jar le contenu du
    chargeur de classe d'application: il est aussi appelé le chargeur de classe système, qui est responsable du chargement de toutes les classes ClassPath le chemin de la classe utilisateur. Si l'application ne définit pas son propre chargeur de classe avait, en général, utiliser le chargeur de classe d'application par défaut.
  • chargeur de classe définie par l' utilisateur, hériter du java.lang.ClassLoader
    Insérer ici l'image Description
    du modèle de délégation de chargeur de classe parent (Délégation parents Model) (3).:
  • Processus de travail: Si une charge de chargeur de classe a reçu une demande, il ne tentera pas d'utiliser leurs propres charges de la classe, mais de déléguer cette demande au chargeur de classe parent pour terminer chaque niveau du chargeur de classe est vrai, par conséquent toutes les demandes de charge ultime doit être transféré au début de la charge de la classe supérieure, seuls les commentaires des parents qu'ils ne peuvent pas remplir la demande de chargement (pas dans sa recherche pour trouver les catégories requises) lorsque la sous-classe va essayer de le charger .
  • Avantages: La relation entre l'organisation modèle des parents d'accumulateurs nommés, il y a un avantage évident est que la
    classe Java comme il est chargé d'une relation hiérarchique de priorité avec, par exemple, la charge située
    rt.jar de java. lang.Object classe, quelle que soit les charges de chargeur de classe de la classe, par la suite confiée à
    la partie supérieure du chargeur de classe de démarrage à la charge, de sorte que l'environnement de chargeur de classes d'objets dans divers types de programmes sont dans la même classe.
    (4) Exemple de code:
public class Test{
public static void main(String[] args) throws IOException {
	Object obj = new Object();
	System.out.println(obj.getClass().getClassLoader());
	MyClass mc = new MyClass();
	System.out.println(mc.getClass().getClassLoader().
	getParent().getParent());
	System.out.println(mc.getClass().getClassLoader().getParent());
	System.out.println(mc.getClass().getClassLoader());
	}
}
class MyClass{}

modèle de délégation des parents est importante pour le bon fonctionnement de Java, mais la mise en œuvre sous-jacente est très simple, les parents java.lang.ClassLoader RÉALISÉ délégués grand ensemble de code dans la méthode loadClass (): si le contrôle avait déjà été chargé, sinon chargé alors appeler le parent méthode loadClass de la classe, jusqu'à ce qu'il trouve un chargeur de classe de démarrage, classe de chargeur de démarrage des éléments de recherche menées dans leur gamme, si le chargeur de classe parent ne se charge pas, alors la gestion des exceptions sous-classe, elle-même appelle la méthode FindClass pour le chargement.

protected synchronized Class<?> loadClass(String name, boolean
resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
private Class findBootstrapClass0(String name)throws ClassNotFoundException{
	check();
	if (!checkName(name))throw new ClassNotFoundException(name);
	return findBootstrapClass(name);
}
private native Class findBootstrapClass(String name)throws ClassNotFoundException;
  1. les détails de configuration de mémoire JVM
    Insérer ici l'image Description
    Remarque: La zone orange représente les données partagées par tous les threads de zone grise représente le fil isolé
  • Programme de lutte contre: Il est un petit espace de mémoire, il peut être considéré comme un indicateur du fil de numéro de ligne de bytecode d'exécution. interpréteur de bytecode en cours de fonctionnement en modifiant la valeur du compteur est le prochain code binaire pour sélectionner une instruction à exécuter, une branche, en boucle, la ramification, la gestion des exceptions, fils et autres fonctions de base sont dépendants de l'activation du compteur à remplir. Pendant ce temps, afin de rétablir l'interrupteur de fil à la position d'exécution correcte, chaque thread nécessite un compteur de programme distinct, entre les fils indépendamment les uns des autres, magasin indépendant, nous appelons ce type de zone de mémoire pour le « fil privé » mémoire
  • Java pile de machine virtuelle: le compteur de programme, comme privé de fil, et le cycle de vie du même fil. Est une pile d'une machine virtuelle Java modèle de mémoire méthode décrite réalisée: Chaque méthode crée un cadre de pile (StackFrame) tout en effectuant le stockage de l'information de table des variables locales, opérande pile, la liaison dynamique, l'exportation de la méthode. Chaque appel de méthode jusqu'à ce que l'exécution est terminée, elle correspond à une trame de pile sur une machine virtuelle pour pousser la pile hors de la pile pendant
    Insérer ici l'image Description
  • piles de méthodes natives: Utiliser la méthode native de service de la machine virtuelle, appartient également au fil zone de données privées. Dans des circonstances normales, on n'a pas besoin de se concentrer sur ce domaine.
  • Procédé de District: également connu sous le nom de non-tas pour la machine virtuelle de stockage d'informations de classe a été chargé, des constantes, des variables statiques, le compilateur de temps pour compiler le code et d' autres données, chaque fil est une zone de mémoire partagée.
    Note: une région appelée la piscine constante d'exécution (Runtime Constant Pool) dans la zone il existe une méthode, qui est principalement utilisé pour stocker les différents symboles compilés littéraux et les références à cette partie seront stockés dans la piscine constante d'exécution du chargeur de classe dans.
  • tas Java: Il est la plus grande partie de la mémoire dans la gestion de la machine virtuelle Java, et est partagé par tous les threads dans une zone de mémoire créée lorsque la machine virtuelle est sous tension, l'objectif principal est de stocker une instance d'objet. En même temps , cette zone est la zone la plus importante de la gestion du collecteur des ordures, et donc souvent aussi appelé « tas GC », selon l' algorithme de collecte des ordures génération utilisé par les collectionneurs.
    mémoire Heap logiquement divisé en:
    Insérer ici l'image Description

Collecte des déchets

  1. Déterminer si des objets morts
    (1) algorithme de comptage de référence: l' ajout d' un compteur de référence, à savoir, à chaque fois qu'une place pour référence à cet objet, le compteur est incrémenté de un pour chaque objet, en se référant à l' échec, le compteur est décrémenté de 1, toute 0 temps objet compteur n'est plus utilisé.
    Avantages: facile à mettre en œuvre les opérateurs de comptage de référence, est déterminée à haut rendement
    inconvénients: il est difficile de résoudre le problème circule entre la référence d'objet.
    Remarque: la machine virtuelle Java dominante actuelle ne pas utiliser l' algorithme de comptage de référence pour gérer la mémoire.
    (2) algorithme d'analyse d'atteignabilité: En tant que point de départ pour effectuer la recherche par le biais d' une série d'objets appelés « GC » Roots vers le bas à partir de ces noeuds, le chemin parcouru recherche appelé chaîne de référence (chaîne de référence), lorsqu'un objet Roots GC sans aucune référence à la chaîne, la preuve ne sont pas disponibles lorsque l'objet.
    Insérer ici l'image Description
    Dans le langage Java, comme un objet Roots GC peuvent inclure les éléments suivants:

    • VM pile (structure de pile de table de variables locales) des objets référencés
    • L'objet de classe de propriété de la méthode référencée par région
    • Le procédé de la région d'objet de référence constante
    • pile de la méthode native (Native Method) des objets référencés
  2. classification Citée
    (1) Contexte: La compréhension que seul un objet est référencé ou non référencé dans les deux états traditionnels, mais pour décrire comment « geste de mauvais goût » de l'objet ne peut pas se permettre. Nous voulons décrire une classe d'objets: Lorsque l'espace mémoire est suffisant, est capable de rester aussi en mémoire, après la réalisation de la collecte des ordures si l' espace mémoire est encore très serré, vous pouvez jeter beaucoup de ces objets (fonction tampon systèmes sont conformes à ces applications scène).
    (2) Après JDK1.2, la référence à l'objet est divisé en quatre niveaux, de sorte que le programme peut être plus cycle de vie d'objet de contrôle flexible:

    • Une référence forte (Strong de référence)
    • références souples (Soft Référence)
    • références faibles (faible) de référence
    • Référence virtuelle (Phantom référence)

    (3) niveaux de référence de haut en bas: références strong> référence douce> référence faible> référence fantôme

    • Fort Quote: est le programme le plus couramment utilisé en référence à un même « objet obj = new Object (); » référence un, tant qu'il y a des références solides, le garbage collector ne se remettra jamais des références solides dans l'objet, même lorsque la mémoire quand le manque d'espace, machine virtuelle Java jette OutOfMemoryError, pas le recyclage.
    • Citation douce: Il utilisé pour décrire certains, mais pas avec les objets nécessaires. Si un objet ne comporte que des références douces, l'espace mémoire est suffisante, le garbage collector ne récupère pas, si l'espace mémoire est insuffisante, récupérera la mémoire de ces objets. Tant que le garbage collector ne récupère pas, l'objet peut être utilisé par le programme. Il peut être utilisé pour mettre en œuvre référence cache sensible mémoire. Après JDK1.2, fournit la classe SoftReference qui implémente les références douces.
    • références faibles: est utilisé pour décrire les objets qui ne sont pas nécessaires. références faibles et douces citées différence est que: seulement des objets de référence faibles ont plus court cycle de vie. Dans le processus de balayage du fil de collecteur d'ordures dans sa zone de mémoire de compétence, une fois qu'ils ont trouvé seulement des objets de référence faible, quel que soit l'espace mémoire actuel est suffisant ou non, récupérer sa mémoire. Après JDK1.2, il fournit la mise en œuvre de la classe WeakReference faible.
    • Citation virtuelle: Comme son nom l'indique, est inexistante, et plusieurs autres références sont différentes, la référence virtuelle et ne détermine pas le cycle de vie de l'objet. Si un objet ne peut contenir qu'une référence fantôme, et il n'a pas de références, ils sont susceptibles d'être déchets collectés à tout moment, ne peut être obtenue par référence à une instance virtuelle d'un objet. Le seul but de références associées à un paramètre d'objet virtuel est de faire l'objet courant reçoit une notification quand il est nettoyé. Après JDK1.2, il fournit une référence virtuelle de classe PhantomReference.
  3. Différentes régions de collecte des ordures
    Insérer ici l'image Description
    zone de méthodes: à savoir HotSpot VM au nom de la collection principale de récupération en mémoire à générations permanent, permanent de deux parties: une constante et objet de la classe des déchets inutiles

  • constantes Abandoned: Supposons que la chaîne constante « abc » est entré dans la piscine constante, mais le système actuel n'a pas de point de référence à une constante chaîne « abc », il n'y a pas d'autre endroit pour utiliser le « abc » constante littérale, si la récupération de mémoire se produit, et aussi dans les circonstances, il est nécessaire, il serait « abc » constantes claires.
  • Nul objet de classe:
    (1) toutes les instances de classes d'objets ont été récupérés, à savoir, il n'y a pas de pile réelle classe Java
    Exemple
    (2) charger le chargeur de classe de classe a été récupéré
    (3) correspondant à la classe java objet .lang.Class n'est pas référencé nulle part, en aucune manière
    par la méthode de réflexion à côté classe d'accès
    Remarque: les objets inutiles ici qui satisfont les trois conditions peuvent être recyclés, mais pas obligatoire. Doivent être récupérés
    peuvent être contrôlés par des paramètres -Xnoclassgc,
    permet également XX: + TraceClassLoading classloading informations de vue.
  • Heap: en particulier dans la nouvelle collecte des ordures de génération, les applications de routine de collecte des ordures peut être récupéré généralement 70% à 95% de l'espace.
    Figure allocation de mémoire de tas:
    Insérer ici l'image Description
    Description: zone néonatale est créée, l'application, la zone filière de l'objet, un objet généré ici, doit être
    utilisé, éventuellement des déchets collectés, meurent. zone de première année est divisée en deux parties: la zone Eden et survivants
    région. Tous les objets (nouveau) sont nouvellement créés dans la région de Eden, divisé en deux survivants: survivants Zone 0
    et Zone 1, lorsque la zone Eden de l' espace utilisé, le programme devra créer un nouvel objet, objets JVM Irak région d' Austin pour commencer la collecte des ordures, l'application est YGC, l'objet ne sera plus utiliser la zone Eden ont été détruits, et le reste de l'objet zone Eden à la zone de survivants 0, zone 0 complète de la zone de destruction des ordures 0 objet survivant aux survivants de la zone 1, zone 1 si elle est trop plein, puis déplacer la zone à la zone de pension 1, si la zone de retraite est pleine, la machine virtuelle Java ouvrira FullGC (abréviation: FGC), réalisée mémoire propre de la zone de retraite. Mais si la mise en œuvre complète GC ne peut toujours pas enregistrer le nouvel objet est généré exception OOM: débordement de tas
  1. algorithme de collecte des ordures
    (1) Marque - algorithme de balayage (Marc-balayage) : Il est le plus algorithme de collecte des ordures de base, d' autres algorithmes sont basés sur cette idée et l' amélioration. Mark - algorithme de balayage est divisé en « marque » et « claires » deux étapes: la première marque les objets doivent être récupérés, la marque après l'unification de tous les objets sont marqués récupération.
    Insérer ici l'image Description
    inconvénients:
  • Mark et balayage en deux l'efficacité des processus est peu élevé
  • Marker va générer beaucoup de fragmentation de la mémoire discrète après compensation, se produira l' objet ultérieur grand ne peut être trouvée
    au problème de l' espace disponible
    (2) l'algorithme de copie (Copie) : il mémoire disponible est divisée en deux, chacun seulement un, lorsque cela est à court de mémoire également les objets vivants copiés sur un autre morceau de ce qui précède, l'espace mémoire qui a été utilisé une fois, puis ressorte propre.
    Insérer ici l'image Description
  • Analyse: Bien que cet algorithme est simple, l'efficacité de la mémoire haute, difficile de produire des débris, mais le plus gros problème est que la mémoire disponible est comprimé à la moitié de l'original. Et le nombre d'objets vivants, l'efficacité des algorithmes La copie sera grandement réduite.
  • Applications: version commerciale actuelle de l'algorithme de réplication de machine virtuelle en utilisant la nouvelle génération recyclée, la nouvelle génération de 98% des objets sont « le soir brut vers les morts, » si l'espace mémoire de tas est divisé en un plus grand morceau d'Eden et deux Servivor plus petits (survivants) l' espace, la machine virtuelle HotSpot et Servivor Eden rapport de taille par défaut de 8: 1. Chaque fois que vous utilisez un Servivor Eden et qui, une fois récupéré, la copie unique et Servivor Eden aussi des objets vivants à un autre morceau Servivor, Eden finalement ressorte propre et utilisé l' espace Servivor
    marque (3) - Collation Algorithm ( marque compact) : opération de marquage et - algorithme « marque balayage » comme une opération de suivi directe devient propre pas l'objet, mais lorsque le nettoyage est terminé des objets inutiles afin que tous les objets vivants sont déplacés vers la fin, puis nettoyer directement à la frontière de fin autre que la mémoire.
    Insérer ici l'image Description
  • Analyse: pas de fragmentation de la mémoire, nous avons besoin de déplacer des objets sur la base des marques ou réduira l'efficacité
    de.
  • Applications: taux de survie plus élevé cible âge, cet algorithme de collecte couramment utilisés pour le recyclage.
    (4) algorithme de collection génération (générationnelles Collection) : l'entreprise de collecte des ordures actuelle des machines virtuelles sont basées sur la « collection de génération », l'idée de base est basée sur l'objet vivant la mémoire du cycle de vie est divisé en plusieurs zones différentes. En général, lorsque la zone de tas dans les caractéristiques de l'ancienne année (Titularisé génération) et la nouvelle génération (jeune génération), la vieillesse est un moment que quelques objets doivent être la collecte des déchets recyclés, et les caractéristiques de la nouvelle génération est que chaque fois que la collecte des ordures a un grand nombre d'objets à récupérer, alors nous pouvons l'algorithme de collecte le plus approprié en fonction des caractéristiques des différentes générations.
  • L'algorithme de GC La plupart JVM pour la nouvelle génération ont pris copie
  • objets Parce que chaque ancienne génération pour récupérer seulement une petite quantité, en utilisant ainsi Mark-Compact algorithme
Publié 24 articles originaux · a gagné les éloges 1 · vues 507

Je suppose que tu aimes

Origine blog.csdn.net/Mr_YXX/article/details/104936116
conseillé
Classement