Optimisation JVM
Transcription
Optimisation JVM
Optimisation JVM Fred RIVARD : [email protected] I.Présentation des entreprises et de l'intervenant II.Introduction : java et ses composantes, un ex d'optimisation. III.Compilateurs Java et classfiles. IV.Machines virtuelles Java et classfiles. V.Implications sur les programmes Java. I.Présentation des entreprises et de l'intervenant Liemur : www.liemur.com IST (patron : l'intervenant : une à nantes et une ?) www.ist-eu.com environ 30personnes Objectif du cours : comprendre les différents « composants opérationels » de JAVA – chaine de compil et son résultat : le classfile – machine virtuelle java, JVM – les liens entre les composants etre capable de faire des choix et des compromis – vitesse, mémoire – design, framework mieux appréhender son métier d'informaticien – vision globale : desigh, implémentation, éxécution, optimisation – maitrise des implications des choix effectués • maintenace, évolutivité, fiabilité, coûts délais II.Introduction : java et ses composantes, un ex d'optimisation. Fichier source (evm.java) librairie (object.class) | JVM --> JAVA compilateur -> Classfile (Bytecode) (evm.class) A cause du bytecode verifier => empêche que l'on prenne le contrôle sur la JVM Un objet à la même taille qlq soit le chemin par lequel on y accède. Pas mal de langage compile le JVM : même si le langage JAVA a évolué, la JVM elle non. Langage et JVM = 2 composants interfacés par le « classfile » Faire une optimisation, TEST : est-ce q je suis ds le cas de mon optimisation ? Diapo : La machine vituelle Java Methode native : celle qu'on ne peut écrire en java et qui sont donc en assembleur, en C. 8milliards de micro contrôleur dans le monde. Gestion de mémoire = 50% des bugs. Garbage collected (GC) gère la mémoire de la machine pour nous ! Execution engine = moteur d'exécution. Diapo : Classfiles et Bytecodes 5ingénieur en C pour 1 en JAVA pour faire une application byte b <127; b++; => b=-128 car les bytes sont circulaire : de -128 à 127 ARM9_J => J indique q certains code de la machines virtuelles sont en hardware (environ 70%) => la machine virtuelle = processeur JAVA multitâche avec en plus une gestion de la mémoire et un jeu d'instruction. Diapo : un exemple d'optimisation Le ratio : le premier code, plus long et appelant des librairies (+=) qui n'existe pas ds la JVM est 13 fois plus long. Diapo 13: Optimisation de code voir coloration de graphe Il vaut mieux optimisé le code une fois qu'on a fait le bench. III.Compilateurs Java et classfiles. Diapo 15: Paser et scanner tableau : val=i+2*10;\n Diapo 16: Difficultés & Solution \u0041 => implique les test de \ puis u puis le numéro pour associer la lettre «==» « equals » meme objet compar l'intérieur des objets =>plus long Donc optimisation : minimisation du nombre d'objet Diapo 16: Arbre de syntaxe Diapo 21 : Propagation des constantes tout ce qui est final ect... ce qui veut dire que en interne le compilateur est capale de faire des calculs : il est capable de mettre 21 dans les autres prog. Diapo 21 : Analyse sémantique dans le premier on a une valeur pour i dans le second(avec le || ) pas forcément ! IV.Machines virtuelles Java et classfiles. Diapo 21 : Le classfile Diapo 26 : Constants POOLS 2 types de string : – Référencé à la volé – Référencée dans les constantes pool (on peut utiliser = = ) => string littéraux (« Hello ») si on la met ainsi dans une classe et dans l'autre, ce sont les même sémantiquement. UTF8 = chaîne sous forme de bytes pour référencé les chaîne ASCII, gère si c'est plus gd qu'une chaîne ASCII. Diapo 26 - numéro de version - numéro de version du JVM? JBB? - classe du constant pool version, longueur (0001 ou 0003) Diapo 29 [8] NameAndType <init>.... = constructeur Diapo 30 native int foo(byte b1, byte b2, int i); java.lang.Object Ljava/lang/Object; (BBI)I Si on a : native int foo(byte b1, byte b2, Object i); java.lang.Object Ljava/lang/Object; (BBLjava/Lang/Object;)I Diapo 31 Méthode qui n'ont pas de code : les abstracts (les interface qui sont des abstracts par défaut), les natives Diapo 32 Méthode qui n'ont pas de code : les abstracts (les interface qui sont des abstracts par défaut), les natives Diapo 34 Chaque thread dans une machine java à sa propre pile d'exécution. Le compilateur a été capable de déterminer lui même la taille de la pile nécessaire. 0000 007F 0000 0080 FFFF FF80 127 128 -128 0111 1111 1000 0000 car bit de poids fort à 1 : négatif Diapo 35 bytecode : sipush pour mettre le -128. et on met un Add devant. Diapo 36 : Manipulation de la pile a load_o //chargemnet du receveur i load_4 //chargemnet du bloc 4 bar(){ int i ; //4 this.floo(i); } Tout est fortement typé => on ne peut pas déférencé des pointeurs dans autre choise Diapo 38 : Exemple on retourne 300 à la fin Le dup est là pour garder le résultat à envoyé sur la pile ainsi qu'avoir un résultat à envoyer Diapo 39 : Les tableaux & les objets le constructeur appelle la classe pour nous Diapo 40 : Accès aux fiels & type objets Point x y <init> x<-10 y<-10 => aload_0 bipush 10 putfield x aload_0 (dépile l'ensemble) bipush 10 putfield y diapo 42 bug : manque un « dup » diapo 52 Le compilateur aujourd'hui duplique le code de finaly => ne pas mettre trop de code dans le finaly diapo 66 Le hashCode permet décrire des hashTable : permet de rechercher dans une table, à partir d'un indice (une clef) donné. diapo 69 chaque méthode pointe sur la méthode de l'objet précédent si elle est pas définis dans l'objet courrant. main(A a){ a.foo(); //invokevirtual 1 a.bar(); //invokevirtual 2 } diapo 70/71 L'invoque interface est lent. diapo 74 La politique des threads en java n'est pas spécifiée ! => Vérifier q lorsque l'on fait des threads on n'est pas dépendant de la politique de schéduligue => ne pas faire de supposition sur l'ordonnancement. Problème de l'inversion de prioriré : un threduler qui prend la main car un autre es dans la zone critique, et qui veut lui meme entrer dans la section critique. diapo 76 Un objet vivant = racine = objet atteingnable depuis un autre objet vivant. Diapo 79 Les racines dans les stacks ! Certaines machines hardware sont capable de tager un pointeur afin qu'on sache ce qui s'y trouve (basetype ou reference..) Diapo 81 on a du JIT code, le compil java compile et embarque à la volée ce code pb avec le natif : qd il faut enlever l'exception Diapo 83 field versus local charger objet, vérifier qu'il est pas null et renvoyer la valeur La val est local au thread on y a accès directemnt parcourire les tableaux à l'envers Parcours du tableau à l'envers, 2intêret, ça évite les org? De plus c plus rapide car on fait les tests à 0 plutot qu'à n or les tests à 0 sont toujours optimisés. On veut savoir si un objet de la classe A est bien égal à a equals(Object a){ if(a = = null) return false; if(a instant of A){ try { a' <- (A)a; .... }catch(){} return false; } } Code objet = sans if Plus ya de if, plus ça va vite ! Attention aux codes multi-threadé : les librairies viennent avec du code multi-threadé. eviter les synchronize qd le code n'a pas besoin d'être multithread car ça y bouffe 10% du temps. Les décalages sur les bites, char, short ne marche pas bien ! Regarder ou sont les natives des API, appelés tout de suite les natives V.Implications sur les programmes Java.