Question

Comment bytecode se vérifie dans la machine virtuelle Java?

Était-ce utile?

La solution

Oracle ont eux-mêmes une petite page d'extrait sur la façon dont cela fonctionne ici .

En fait, le JRE ne fait pas confiance JDK. C'est parce qu'il n'a pas connaissance du compilateur a créé le fichier JDK de classe. Il traite le fichier de classe hostile qu'après avoir été vérifiées.

L'expansion sur ce point, la vérification de bytecode est une étape nécessaire pour protéger de ce que Sun appelle un « compilateur hostile ». propre compilateur Java assure que le code source Java ne viole pas les règles de sécurité mais, lorsqu'une application importe un fragment de code, il ne sait pas vraiment si le fragment de code suivant Java règles linguistiques pour la sécurité du soleil. En d'autres termes, le code peut ne pas avoir été produit par un compilateur Java digne de confiance.

Dans ce cas, le système de temps Java exécuter sur votre machine doit assumer le fragment est mauvais et la soumet à bytecode vérification.

La machine virtuelle Java ne même pas voir le bytecode jusqu'à ce qu'il a été à travers ce processus de vérification. Faire ce que le bytecode est chargé a aussi l'avantage que beaucoup de contrôles de temps d'exécution ne doit pas être effectuée chaque fois que le code est exécuté. Parce qu'il a été vérifié comme correct, il peut, une fois qu'il commence à courir, courir plus vite que cela ne serait possible.

Une interprétation du diagramme est lié ci-dessous:

                    <<<=== Unsafe / Safe ===>>>
                                  \
+---------------+        +-------------------+
|  Java source  |   +--> |   Class loader    | --+
+---------------+   |    | Bytecode verifier |   |
        |           |    +-------------------+   |
        V           |             /              |
+---------------+   |             \              V
| Java compiler |  Network        /    +-------------------+
+---------------+   |             \    |      JVM/JIT      |
        |           |             /    +-------------------+
        V           |             \              |
+---------------+   |             /              V
| Java bytecode | --+             \    +-------------------+
+---------------+                 /    | Operating system  |
                                  \    +-------------------+
                                  /              |
                                  \              V
                                  /    +-------------------+
                                  \    |     Hardware      |
                                  /    +-------------------+
                                  \
                    <<<=== Unsafe / Safe ===>>>

Autres conseils

La meilleure source d'information est probablement la section correspondante dans la spécification JVM, 4.10 Vérification de la classe des fichiers .

Voir le lien pour plus de détails, mais globalement:

  

vérification Liaison temps améliore les performances de l'interprète. contrôles coûteux qui auraient autrement à effectuer pour vérifier les contraintes au moment de l'exécution pour chaque interprété peut être éliminé instruction. La machine virtuelle Java peut supposer que ces contrôles ont déjà été effectués. Par exemple, la machine virtuelle Java déjà savoir ce qui suit:

     
      
  • Il n'y a pas de débordement ou sousverses pile.
  •   
  • Toutes les utilisations variables locales et les magasins sont valides.
  •   
  • Les arguments à toutes les instructions de la machine virtuelle Java sont des types valides.
  •   
     

Le vérificateur effectue également la vérification qui peut être fait sans regarder le tableau de code de l'attribut code (§4.7.3). Les contrôles effectués sont les suivants:

     
      
  • Faire en sorte que les classes finales ne sont pas subclassed et que les méthodes finales ne sont pas surchargées (§5.4.5).
  •   
  • Vérifier que toutes les classes (sauf Object) a une superclasse directe.
  •   
  • Veiller à ce que la piscine constante satisfait aux contraintes statiques documentées; par exemple, que chaque structure de CONSTANT_Class_info dans la piscine constant contient dans son élément de name_index un indice de piscine constant valable pour une structure de CONSTANT_Utf8_info.
  •   
  • Vérifier que toutes les références de champ et les références de méthode dans la piscine constante ont des noms valides, des classes valides, et un descripteur de type valide.
  •   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top