recherche

Maison  >  Questions et réponses  >  le corps du texte

java程序运行的时候,是把所有的class文件都加载到内存吗?还是用的什么加载什么?

一运行就全部加载?

高洛峰高洛峰2802 Il y a quelques jours581

répondre à tous(4)je répondrai

  • PHP中文网

    PHP中文网2017-04-18 10:51:58

    Tous ne sont pas chargés, cela peut être compris comme un chargement à la demande.
    Par exemple, la classe parent héritée, l'interface implémentée, les variables déclarées, le type de retour de la méthode, etc.

    C'est-à-dire que lors de l'utilisation de la classe actuelle, toutes les classes nécessaires manquantes seront chargées immédiatement.

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:51:58

    Chargement sur demande.
    Heure du chargement des cours :

    1) Lorsque vous rencontrez les quatre instructions de bytecode new, getstatic, putstatic ou Ensurestatic, si la classe n'a pas été initialisée, son initialisation doit d'abord être déclenchée. Les scénarios de code Java les plus courants qui génèrent ces quatre instructions sont : lors de l'utilisation du mot-clé new pour instancier un objet, la lecture ou la définition d'un champ statique d'une classe (modifié par final, et le résultat a été placé dans le pool constant au moment de la compilation ). champs), et lors de l’appel d’une méthode statique d’une classe.
    2) Lorsque vous utilisez la méthode du package java.lang.reflect pour effectuer un appel réflexif à une classe, si la classe n'a pas été initialisée, son initialisation doit d'abord être déclenchée.
    3) Lors de l'initialisation d'une classe, s'il s'avère que sa classe parent n'a pas été initialisée, vous devez d'abord déclencher l'initialisation de sa classe parent.
    4) Lorsque la machine virtuelle démarre, l'utilisateur doit spécifier une classe principale à exécuter (la classe contenant la méthode main()), et la machine virtuelle initialisera d'abord la classe principale.
    5) Lors de l'utilisation du support du langage dynamique du JDK 1.7, si le résultat final de l'analyse d'une instance java.lang.invoke.MethodHandle est le handle de méthode de REF_getStatic, REF_putStatic, REF_invokeStatic et que la classe correspondant à ce handle de méthode a n'a pas été initialisé, vous devez d'abord déclencher son initialisation.
    Pour ces cinq scénarios qui déclencheront l'initialisation d'une classe, la spécification de la machine virtuelle utilise un qualificatif très fort : "oui et seulement". Le comportement dans ces cinq scénarios est appelé référence active à une classe. De plus, toutes les méthodes de référencement d’une classe ne déclencheront pas d’initialisation et sont appelées références passives.

    Source : Compréhension approfondie du timing de chargement des classes JVM 7.2

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:51:58

    Je n’ai pas encore bien compris ce domaine, donc je n’ose pas induire les autres en erreur.
    Comme je le sais, lorsque la machine virtuelle est en cours d'exécution, elle préchargera une classe couramment utilisée, telle que celle du package java.lang.
    En ce qui concerne les fichiers de classe/packages jar que vous référencez dans votre programme, il existe un processus de chargement.
    Lorsque la machine virtuelle a besoin d'un fichier de classe, elle appellera la classeLoader.loadClass() par défaut pour le charger. Cette méthode recherche d'abord la classe chargée si elle est trouvée, elle sera bien sûr renvoyée. trouvé, il sera remis au chargeur parent. Après avoir recherché couche par couche, classLoader appellera la méthode findClass pour charger le fichier.
    Classe protégée<?> loadClass (Nom de la chaîne, résolution booléenne)

        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
    
                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);
    
                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:58

    http://blog.csdn.net/briblue/...
    Vous pouvez vous référer à ce blog, il est très bien

    répondre
    0
  • Annulerrépondre