java程序运行的时候,是把所有的class文件都加载到内存吗?还是用的什么加载什么?
高洛峰
高洛峰 2017-04-18 10:49:58
0
4
531

一运行就全部加载?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(4)
洪涛

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.

Peter_Zhu

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

巴扎黑

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;
    }
伊谢尔伦

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!