Maison  >  Article  >  Java  >  Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

Java后端技术全栈
Java后端技术全栈avant
2023-08-23 15:05:471587parcourir

Loading

Lorsque nous voulons utiliser une classe, nous devons la charger en mémoire via ClassLoader

"La phase de chargement de la classe complète principalement les trois choses suivantes"

  1. Obtenez le flux binaire de la classe via le nom complet de la classe
  2. Analysez le flux binaire de la classe dans la structure de données dans la zone des méthodes
  3. Créez une instance de la classe java.lang.Class à représenter le type, comme zone de méthode cette entrée d'accès à la classe
Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

"Il existe de nombreuses façons d'obtenir le flux binaire d'une classe via le nom complet de la classe"

  1. Obtenez-le à partir du package zip
    "Récupérez-le depuis le réseau" dans le chargeur de classe de la machine virtuelle Java pour terminer, ou vous pouvez utiliser le chargeur de classe personnalisé pour terminer"
  2. Lien

    "Cette étape de liaison est principalement divisée en 3 parties, vérification, préparation et analyse"

    Vérification

    " L'étape de vérification est principalement pour garantir que Classe Le format du fichier est correct et ne mettra pas en danger la sécurité de la machine virtuelle lors de son exécution."

    Il existe de nombreuses règles dans la phase de vérification, mais elles sont grossièrement divisées en quatre étapesIntervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes) "Je n'expliquerai pas les détails spécifiques en détail, vous pouvez voir" "Compréhension approfondie de la machine virtuelle Java", cet article préfère faire un résumé et saisir le processus global de chargement des classes sans élaborer sur les détails. pour les variables statiques de la classe et initialisez-les aux valeurs par défaut"

    Les valeurs par défaut des types de données courants sont les suivantes
    Type de données Valeur par défaut
    byte (byte)0
    short (short)0
    int 0
    long 0L
    float 0.0f
    double 0.0d
    boolean false
    char 'u0000'
    référence null

    "Si l'attribut ConstantValue existe dans la table attributaire de champ de la variable statique de classe, l'instruction d'affectation sera exécutée directement"

    Alors dans quelles circonstances l'attribut ConstantValue existe-t-il dans la table attributaire de champ de la variable statique de classe ?

    1. Les variables statiques de classe sont des types de données de base et sont modifiées par final
    2. Les variables statiques de classe sont de type String, sont modifiées par final et se voient attribuer des valeurs sous forme de littéraux

    Dans l'ordre pour faciliter la visualisation des octets du code du fichier Class, j'ai téléchargé un plug-in jclasslib Bytecode viewer dans IDEA, ce qui est très pratique. Utilisez le code suivant pour le vérifier sous forme de bytecode

    public class Person {
    
        private static int age = 10;
        private static final int length = 160;
        private static final String name = "name";
        private static final String loc = new String("loc");
    }

    Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)"Ainsi, les attributs de longueur et de nom se verront attribuer les valeurs spécifiées par ConstantValue lors de la phase de préparation"

    "Puis à quelle étape le les attributs age et loc doivent-ils être attribués ? classes, interfaces, champs et méthodes en références directes 》Référence symbolique : utilisez un ensemble de symboles pour décrire la cible référencée Référence directe ; pointeur direct vers la cibleIntervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

    Rejoignez-moi et écrivez une classe comme suit

    public class Student {
    
        private String name;
        private int age;
    
        public String getName() {
            return this.name;
        }
    }
    En prenant les champs comme exemple, les objets correspondant au nom et à l'âge ne pointent pas directement vers l'adresse mémoire, mais sont décrits avec des chaînes ( c'est-à-dire référence symbolique). L'étape d'analyse consiste à convertir ces descriptions en pointeurs pointant directement vers la cible (c'est-à-dire des références directes)

    初始化

    「执行类静态成员变量赋值语句和静态代码块中的语句」

    Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

    我们把上面的Student代码改成如下形式

    public class Student {
    
        private String name;
        private int age = 10;
        private static int gender = 1;
    
        {
            System.out.println("构造代码块");
        }
    
        static {
            System.out.println("静态代码块");
        }
    
        public Student() {
            System.out.println("构造函数");
        }
    
        public String getName() {
            return this.name;
        }
    }

    可以看到字节码中包含了3个方法,getName方法我们知道,7e51f00a783d7eb8f68358439dee7daf和583d030be372af71281df966e84181a5方法里面执行了哪些逻辑?Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)从字节码的角度分析一波

    「7e51f00a783d7eb8f68358439dee7daf方法」

    Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

    从字节码可以看到7e51f00a783d7eb8f68358439dee7daf方法的主要逻辑为

    1. 调用父类的7e51f00a783d7eb8f68358439dee7daf方法
    2. 非静态成员变量赋值
    3. 执行构造代码块
    4. 执行构造函数

    Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)「583d030be372af71281df966e84181a5方法」Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)从字节码可以看到583d030be372af71281df966e84181a5方法的主要逻辑为

    1. Exécutez l'instruction d'affectation de la variable statique
    2. Exécutez l'instruction dans le bloc de code statique
    3. Une chose à noter est que "La machine virtuelle Java garantit cela avant la méthode de la sous-classe est exécuté, la méthode f7729255ed3b5adeaf95ded0aa3581a1 de la classe parent a été exécutée"

    "Il est encore nécessaire de comprendre le rôle des méthodes 583d030be372af71281df966e84181a5 et 7e51f00a783d7eb8f68358439dee7daf à propos des blocs de code statiques, des blocs de code construits et de l'ordre d'exécution des fonctions construits "

    Je vais résumer la conclusion directement ici. Vous pouvez écrire une démo pour la vérifier

    "Ordre d'exécution sans héritage"

    1. Blocs de code statiques et variables membres statiques, l'ordre d'exécution est donné par L'ordre d'écriture est déterminé (il ne sera exécuté qu'une seule fois)
    2. Construisez des blocs de code et des variables membres non statiques, l'ordre d'exécution est déterminé par l'écriture order
    3. Constructor

    "Ordre d'exécution avec héritage"

    1. Statique (bloc de code statique, variables membres statiques) de la classe parent, statique (bloc de code statique, variables membres statiques) de la sous-classe (ne sera exécuté qu'une seule fois)
    2. Non-statique (bloc de code construit) de la classe parent, variables membres non statiques), le constructeur de la classe parent
    3. le non-statique (bloc de code de construction, variables membres non statiques) de la sous-classe, le constructeur de la sous-classe

    Unloading

    Le garbage collection se produit non seulement dans le tas, mais également dans la zone des méthodes. Cependant, les conditions de recyclage des données de type dans la zone méthode sont assez strictesIntervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)Intervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)La figure suivante est un exemple Je souhaite recycler la classe Simple dans la zone méthode

    .
    1. Vous devez vous assurer que la classe Sample et ses sous-classes dans le tas ont été recyclées
    2. Le MyClassLoader qui charge la classe Sample a été recyclé
    3. L'objet Class correspondant à la classe Sample a été recycléIntervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

    Vous pouvez voir Les conditions de recyclage des données de type dans la zone de méthode sont relativement dures, mais les résultats sont minimes, donc certains éboueurs ne recycleront pas les données de type dans la zone de méthode

    Résumé

    Processus de chargement des classesIntervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

    Processus d'affectation des variablesIntervieweur : Parlez-moi du processus de chargement des classes (10 diagrammes)

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer