Vous êtes sur la page 1sur 22

MAD – Middleware et Applications aDapatables

JVM Adaptation de bytecode Sara Bouchenak, Sara.Bouchenak@imag.fr

JVM Adaptation de bytecode

Sara Bouchenak, Sara.Bouchenak@imag.fr

JVM Adaptation de bytecode Sara Bouchenak, Sara.Bouchenak@imag.fr
JVM Adaptation de bytecode Sara Bouchenak, Sara.Bouchenak@imag.fr
JVM Adaptation de bytecode Sara Bouchenak, Sara.Bouchenak@imag.fr
JVM Adaptation de bytecode Sara Bouchenak, Sara.Bouchenak@imag.fr
JVM Adaptation de bytecode Sara Bouchenak, Sara.Bouchenak@imag.fr
JVM Adaptation de bytecode Sara Bouchenak, Sara.Bouchenak@imag.fr
JVM Adaptation de bytecode Sara Bouchenak, Sara.Bouchenak@imag.fr

http://sardes.inrialpes.fr/~bouchena/teaching/MAD/

JVM

Application Application JVM NT UNIX UNIX PC PC Sparc
Application
Application
JVM
NT
UNIX
UNIX
PC
PC
Sparc
Application Application JVM NT UNIX UNIX PC PC Sparc Abstraction d’un environnement homogène Cacher

Abstraction d’un environnement homogène

Cacher l’hétérogénéité des

systèmes d’exploitation

systèmes de communication

architectures physiques sous-jacentes

Middleware et Applications aDaptables

Introduction

2

Motivations d’un environnement homogène

Application Application JVM NT UNIX UNIX PC PC Sparc
Application
Application
JVM
NT
UNIX
UNIX
PC
PC
Sparc
Application Application JVM NT UNIX UNIX PC PC Sparc Portabilité des applications, du code Facilité de

Portabilité des applications, du code

Facilité de construction d’applications réparties

Middleware et Applications aDaptables

Introduction

3

Plan

Middleware et Applications aDaptables Introduction 3 Plan 1. JVM : une infrastructure middleware pour

1.

JVM : une infrastructure middleware pour environnements hétérogènes

 

Qu’est-ce que la JVM ?

Spécification abstraite

Mise en œuvre concrète

Instance d’exécution

2.

Exemple d’illustration

3.

BCEL : adaptation de bytecode Java

4.

Javassist : adaptation de code Java

5.

Synthèse et Références

Middleware et Applications aDaptables

JVM / Adaptation de bytecode

4

Qu’est-ce que la JVM ?

JVM (Java Virtual Machine)

Machine virtuelle

que la JVM ? JVM ( Java Virtual Machine ) Machine virtuelle Machine abstraite définie par

Machine abstraite définie par une spécification

Nécessite une mise en œuvre concrète pour l’exécution des programmes

JVM : une des trois entités …

Spécification abstraite

Mise en œuvre concrète

Instance d’exécution

abstraite Mise en œuvre concrète Instance d’exécution Middleware et Applications aDaptables 1. JVM 5

Middleware et Applications aDaptables

1. JVM

5

Middleware et Applications aDaptables

1. JVM

6

Spécification de la JVM :

 

Spécification de la JVM :

Spécification de la JVM :   Spécification de la JVM :

Objectif

Objectif

Définir

Définition de l’abstraction d’une machine de calcul :

un comportement externe

 

Ensemble d’instructions Effectuer des calculs numériques Contrôler l’accès à la mémoire Gérer le contrôle des flots d’exécutions (processus / threads) Moyen d’accéder au matériel sous-jacent

 

commun aux différentes mises en œuvre de la machine virtuelle Java

Middleware et Applications aDaptables

1. JVM

7

Middleware et Applications aDaptables

1. JVM

8

Spécification de la JVM

Comportement de la machine virtuelle en termes de :

Types de données

Sous-systèmes d’exécution

termes de : Types de données Sous-systèmes d’exécution Structures de données d’exécution Types de données (1

Structures de données d’exécution

Types de données (1 / 2)

Types références

d’exécution Types de données (1 / 2) Types références Exemples : référence d’instance de classe, de

Exemples : référence d’instance de classe, de tableau

Types primitifs

Taille des types spécifiée Format de codage des types spécifié Exemples : int, float, boolean, etc.

Middleware et Applications aDaptables

 

1. JVM

9

Middleware et Applications aDaptables

1. JVM

10

Types de données (2 / 2)

 

Spécification de la JVM

Types de données (2 / 2)   Spécification de la JVM
 

Type

Taille

Description

   

byte

8

bits

 

Comportement de la machine virtuelle en termes de :

 

Types

short

16

bits

primitifs entiers

int

32

bits

entiers signés en complément à 2

long

64

bits

Types

float

32

bits

 

Types de données

primitifs flottants

double

64

bits

réels au format IEEE 754

Autres types

char

16

bits

entier non signé représentant un caractère Unicode

Sous-systèmes d’exécution

 

primitifs

boolean

non spécifié

entier 1 pour vrai et entier 0 pour faux

returnAddress

non spécifié

pointeur vers instruction

Structures de données d’exécution

 

Types

   

référence vers une instance de classe ou un tableau

 

références

reference

non spécifié

Middleware et Applications aDaptables

 

1. JVM

11

Middleware et Applications aDaptables

1. JVM

12

Sous-systèmes d’exécution

Sous-systèmes d’exécution S ou s-systèm e de chargem ent d e cla s se s p
S ou s-systèm e de chargem ent d e cla s se s p ile
S ou s-systèm e
de chargem ent
d e
cla s se s
p ile s
d e
zone de
m éth o d e s
ta s
d 'o b je ts
p ile s
Java
re g is tre s
p c
m éth o d e s
n a tive s
S tru ctures d e données d 'e x é c u tio n
In te rfa ce
d e
m é th o d e s
n a tiv e s
S ou s-systè m e
d 'e x é c u tio n
L ib ra irie s
d e
m é th o d e s
n a tiv e s
Middleware et Applications aDaptables
1. JVM
13

Sous-système de chargement de classes

Objectif :

JVM 13 Sous-système de chargement de classes Objectif : Lors de l’exécution d’un programme : Charger

Lors de l’exécution d’un programme :

Charger en mémoire les classes et interfaces utilisées Les stocker dans la zone de méthodes de la JVM

Plusieurs chargeurs de classes peuvent cohabiter au sein d’une même JVM

Chargeur à partir du CLASSPATH (ClassLoader) Chargeur à partir d’URL (URLClassLoader)

Middleware et Applications aDaptables

1. JVM

14

URLClassLoader

URLClassLoader

public URLClassLoader(URL[] urls)

URLClassLoader p ublic URLClassLoader (URL[] urls) Constructs a new URLClassLoader for th e specified URLs

Constructs a new URLClassLoader for the specified URLs using the default delegation parent ClassLoader. The URLs will be searched in the order specified for classes and resources after first searching in the parent class loader. Any URL that ends with a '/' is assumed to refer to a directory. Otherwise, the URL is assumed to refer to a JAR file which will be downloaded and opened as needed. If there is a security manager, this method first calls the security manager's checkCreateClassLoader method to ensure creation of a class loader is allowed. Parameters:

urls - the URLs from which to load classes and resources Throws:

SecurityException - if a security manager exists and its checkCreateClassLoader method doesn't allow creation of a class loader. See Also:

SecurityManager.checkCreateClassLoader()

Middleware et Applications aDaptables

1. JVM

15

Définition d’un nouveau chargeur de classes (1 / 2)

15 Définition d’un nouveau chargeur de classes (1 / 2) For example, an application could create

For example, an application could create a network class loader to download class files from a server. Sample code might look like:

ClassLoader loader = new NetworkClassLoader(host, port);

Object main = loader.loadClass("Main", true).newInstance();

.

.

.

Middleware et Applications aDaptables

1. JVM

16

Définition d’un nouveau chargeur de classes (2 / 2)

class NetworkClassLoader extends ClassLoader { String host; int port;

public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length);

}

}

private byte[] loadClassData(String name) { // load the class data from the connection .

}

.

.

Middleware et Applications aDaptables

1. JVM

. } . . Middleware et Applications aDaptables 1. JVM 17 Sous-système d’exécution Mécanisme d’exécution du

17

Sous-système d’exécution

aDaptables 1. JVM 17 Sous-système d’exécution Mécanisme d’exécution du bytecode contenu dans les

Mécanisme d’exécution du bytecode contenu dans les méthodes des classes chargées

Trois formes :

Spécification abstraite : ensemble d’instructions

Mise en œuvre concrète : différentes techniques

Instance d’exécution : thread Java

Middleware et Applications aDaptables

1. JVM

18

Sous-système d’exécution :

Ensemble d’instructions (1 / 4)

d’exécution : Ensemble d’instructions (1 / 4) Compilateur Traduit un programme écrit dans un langage

Compilateur

Traduit un programme écrit dans un langage source vers un langage cible Traditionnellement, le langage cible est le langage d’un processeur physique Programme compilé compris par toute machine de même architecture, pas par les autres architectures

Compilateur Java

Traduit un programme écrit dans le langage source Java vers un

langage cible appelé bytecode le langage cible est le langage d’un processeur virtuel (JVM)

Programme Java compilé compris par toute machine virtuelle, quelle que soit l’architecture physique sous-jacente

Middleware et Applications aDaptables

1. JVM

19

Sous-système d’exécution :

Ensemble d’instructions (2 / 4)

Méthode Java :

suite d’instructions de bytecode

Instruction de bytecode :

suite d’instructions de bytecode Instruction de bytecode : opcode + un ou plusieurs opérandes Opcode :

opcode + un ou plusieurs opérandes

Opcode :

codé sur un octet (byte) spécifie l’opération à effectuer indique s’il est suivi d’un ou plusieurs opérandes indique le type des opérandes

l’opération à effectuer indique s’il est suivi d’un ou plusieurs opérandes indique le type des opérandes
l’opération à effectuer indique s’il est suivi d’un ou plusieurs opérandes indique le type des opérandes
l’opération à effectuer indique s’il est suivi d’un ou plusieurs opérandes indique le type des opérandes

Middleware et Applications aDaptables

1. JVM

20

Sous-système d’exécution :

Ensemble d’instructions (3 / 4)

Exemples d’opcodes :

iadd

opération d’addition opcode suivi de deux opérandes opérandes de type int

fsub

opération de soustraction opcode suivi de deux opérandes opérandes de type float

Middleware et Applications aDaptables

1. JVM

de type float Middleware et Applications aDaptables 1. JVM 21 Sous-système d’exécution : Ensemble d’instructions

21

Sous-système d’exécution :

Ensemble d’instructions (4 / 4)

Instructions : approche / structure de pile val 2 val 1 iadd res … …
Instructions : approche / structure de pile
val 2
val 1
iadd
res
Avant
Après

Avant l’exécution de iadd

val1, val2 : deux valeurs de type int en sommet de pile

Exécution de iadd

val1 et val2 dépilées, additionnées, résultat de type int en sommet de pile

Middleware et Applications aDaptables

1. JVM

sommet de pile Middleware et Applications aDaptables 1. JVM 22 Sous-système d’exécution Mécanisme d’exécution du

22

Sous-système d’exécution

aDaptables 1. JVM 22 Sous-système d’exécution Mécanisme d’exécution du bytecode contenu dans les

Mécanisme d’exécution du bytecode contenu dans les méthodes des classes chargées

Trois formes :

Spécification abstraite : ensemble d’instructions

Mise en œuvre concrète : différentes techniques

Instance d’exécution : thread Java

Middleware et Applications aDaptables

1. JVM

23

Sous-système d’exécution :

Mise en œuvre concrète (1 / 5)

Différentes techniques

Interprétation

concrète (1 / 5) Différentes techniques Interprétation Compilation à la volée ( Just-In-Time compiler )

Compilation à la volée (Just-In-Time compiler)

Optimisation adaptative

Exécution native

Middleware et Applications aDaptables

1. JVM

24

Sous-système d’exécution :

Mise en œuvre concrète (2 / 5)

d’exécution : Mise en œuvre concrète (2 / 5) Interprétation Première génération de JVM Interprète

Interprétation

Première génération de JVM Interprète Java

loop

Première génération de JVM Interprète Java loop lire une instruction de bytecode la traduire en suite

lire une instruction de bytecode

la traduire en suite d’instructions-machine correspondant à

l’architecture sous-jacente exécuter les instruction machine

Avantage / Inconvénients

Simplicité de mise en œuvre Lenteur de l’exécution comparée au code natif

Sous-système d’exécution :

Mise en œuvre concrète (3 / 5)

Compilation à la volée / JIT

en œuvre concrète (3 / 5) Compilation à la volée / JIT Seconde génération de JVM

Seconde génération de JVM

Principe

Si appel d’une méthode Java la première fois

 

méthode compilée vers code natif

exécution de la version native

Appel ultérieur de la même méthode Java

 

exécution de la version native

Avantage / Inconvénients

Temps d’exécution d’un code natif Surcoût dû à la compilation de méthodes rarement appelées (moins coûteux d’exécuter du Java que de compiler puis exécuter du natif)

Middleware et Applications aDaptables

1. JVM

25

Middleware et Applications aDaptables

1. JVM

26

Sous-système d’exécution :

 

Sous-système d’exécution :

Sous-système d’exécution :   Sous-système d’exécution :

Mise en œuvre concrète (4 / 5)

Mise en œuvre concrète (5 / 5)

Optimisation adaptative

 

Exécution native

Combine l’interprétation Java et la compilation à la volée Principe

Principe

Initialement : compilation du programme Java en programme natif Exécution de tout le programme en version native

Avantage / Inconvénients

 

Initialement : interprétation Java Surveillance de l’exécution : informations sur la fréquence d’appel des méthodes Optimisation adaptative : utilisation des info.s pour choisir les méthodes à compiler puis exécuter en natif

Exemples de JVM proposant l’optimisation adaptative

Temps d’exécution d’un code natif

JDK 1.3 et + de Sun (HotSpot VM) Jikes de IBM (Jikes/Jalapeño VM)

Pas de surcoût dû à la compilation

Moins de portabilité

Middleware et Applications aDaptables

1. JVM

27

Middleware et Applications aDaptables

1. JVM

28

Sous-système d’exécution

Sous-système d’exécution Mécanisme d’exécution du bytecode contenu dans les méthodes des classes chargées Trois

Mécanisme d’exécution du bytecode contenu dans les méthodes des classes chargées

Trois formes :

Spécification abstraite : ensemble d’instructions

Mise en œuvre concrète : différentes techniques

Instance d’exécution : thread Java

Sous-système d’exécution :

Instance d’exécution

Java Sous-système d’exécution : Instance d’exécution Instance d’exécution de la JVM = thread Java JVM supporte

Instance d’exécution de la JVM = thread Java

JVM supporte l’exécution de plusieurs threads (processus légers)

Rôle du thread

exécuter le code d’une application bytecode ou code natif

Middleware et Applications aDaptables

1. JVM

29

Middleware et Applications aDaptables

1. JVM

30

Spécification de la JVM

 

Structures de données d’exécution

Spécification de la JVM   Structures de données d’exécution

Comportement de la machine virtuelle en termes de :

 

Pour exécuter un programme, la JVM a besoin de mémoire pour stocker :

 

le code des classes utilisées

 

Types de données

les objets instanciés

Sous-systèmes d’exécution

 

les info.s des méthodes exécutées (paramètres, variables locales, résultat de calculs intermédiaires)

Structures de données d’exécution

 
 

la table des symboles utilisés par le programme

 

Middleware et Applications aDaptables

1. JVM

31

Middleware et Applications aDaptables

1. JVM

32

Structures de données d’exécution

Structures de données d’exécution S ou s-systèm e de chargem ent d e cla s se
S ou s-systèm e de chargem ent d e cla s se s p ile
S ou s-systèm e
de chargem ent
d e
cla s se s
p ile s
d e
zone de
m éth o d e s
ta s
d 'o b je ts
p ile s
Java
re g is tre s
p c
m éth o d e s
n a tive s
S tru ctures d e données d 'e x é c u tio n
In te rfa ce
d e
m é th o d e s
n a tiv e s
S ou s-systè m e
d 'e x é c u tio n
L ib ra irie s
d e
m é th o d e s
n a tiv e s
Middleware et Applications aDaptables
1. JVM
33

Zone de méthodes (1 / 3)

aDaptables 1. JVM 33 Zone de méthodes (1 / 3) Une instance de JVM possède une

Une instance de JVM possède une zone de méthodes partagée par tous les threads de la JVM

Toute classe Java chargée est placée dans la zone de méthodes

Tout thread s’exécutant dans la JVM peut accéder à toute classe chargée dans cette JVM

Middleware et Applications aDaptables

1. JVM

34

Zone de méthodes (2 / 3)

Applications aDaptables 1. JVM 34 Zone de méthodes (2 / 3) Informations relatives à une classe

Informations relatives à une classe dans la zone de méthodes

variables de classes (variables static)

informations sur les méthodes de la classe

constant pool de la classe

Middleware et Applications aDaptables

1. JVM

35

Zone de méthodes (3 / 3)

Informations relatives à une méthode de classe dans la zone de méthodes

à une méthode de classe dans la zone de méthodes nom de la méthode type de

nom de la méthode type de son résultat types de ses paramètres ses modificateurs (public, private, protected, static, final, synchronized, native, abstract)

bytecode de la méthode table d’exceptions table des variables locales

Middleware et Applications aDaptables

1. JVM

table des variables locales Middleware et Applications aDaptables 1. JVM Pour une méthode non abstract et

Pour une méthode non abstract et non native

36

Constant pool

Constant pool Table de symboles de constantes utilisées par la classe Constante utilisée par une classe

Table de symboles de constantes utilisées par la classe Constante utilisée par une classe participe à la définitions de :

la classe

variables de classe ou d’instance

descripteur ou code des méthodes

Forme des constantes

valeurs de chaînes de caractères valeurs de constantes entières ou flottantes noms symboliques de classes, interfaces, méthodes, variables de classe ou d’instance

entières ou flottantes noms symboliques de classes, interfaces, méthodes, variables de classe ou d’instance
entières ou flottantes noms symboliques de classes, interfaces, méthodes, variables de classe ou d’instance

Middleware et Applications aDaptables

1. JVM

37

d’instance Middleware et Applications aDaptables 1. JVM 37 Tas d’objets (1 / 2) Une instance de

Tas d’objets (1 / 2)

Une instance de JVM possède un tas d’objets partagé par tous les threads de la JVM

Toute instance de classe ou de tableau créée est placée dans le tas d’objets

Tout thread s’exécutant dans la JVM peut accéder à tout objet créé dans cette JVM

Middleware et Applications aDaptables

1. JVM

38

Tas d’objets (2 / 2)

Représentation d’un objet

JVM 38 Tas d’objets (2 / 2) Représentation d’un objet valeurs des variable d’instance (attributs de

valeurs des variable d’instance (attributs de l’objet) possibilité d’accès aux informations sur la classe de l’objet

pointeur vers la référence donnéeclassed'instance d'objet donnée d'instance donnée d'instance
pointeur vers la
référence
donnéeclassed'instance
d'objet
donnée d'instance
donnée d'instance
Tas d'objets
classe
Zone de méthodes

Middleware et Applications aDaptables

1. JVM

39

Pile Java

Middleware et Applications aDaptables 1. JVM 39 Pile Java Une pile Java est associée à chaque

Une pile Java est associée à chaque thread, lors de la création du thread

Décrit l’état d’avancement des appels de méthodes Java effectués par le thread

L’état d’un appel de méthode est représenté par une zone appelée frame Java

Middleware et Applications aDaptables

1. JVM

40

Frame Java

Frame Java Appel de méthode Java par un thread un nouveau frame Java est créé et

Appel de méthode Java par un thread

un nouveau frame Java est créé et empilé sur la pile Java du thread

Terminaison de méthode Java par un thread

frame Java associé à cette méthode est dépilé

Middleware et Applications aDaptables

1. JVM

41

Structure d’un frame Java

aDaptables 1. JVM 41 Structure d’un frame Java Table de variables locales valeurs des paramètres de

Table de variables locales

valeurs des paramètres de la méthode

valeurs des variables locales à la méthode

Pile d’opérandes

résultats des calculs intermédiaires effectués lors de l’exécution

de la méthode manipulation de la pile d’opérandes par : empilement en sommet de pile ou dépilement de la tête de pile

Autres informations

pointeur vers le constant pool de la classe de la méthode autres informations dépendant de la mise en œuvre de la JVM

Middleware et Applications aDaptables

1. JVM

42

Frame Java sur pile Java

opérande m opérande 1 Fram e variable n P ile variable 1
opérande m
opérande 1
Fram e
variable n
P ile
variable 1

Java

Middleware et Applications aDaptables

1. JVM

pile

d’opérandes

variables

locales

aDaptables 1. JVM pile d’opérandes variables locales 43 Registre PC Registre PC ( Program Counter )

43

Registre PC

Registre PC (Program Counter)

locales 43 Registre PC Registre PC ( Program Counter ) Lorsque le thread exécute une méthode

Lorsque le thread exécute une méthode Java

PC indique l’adresse de la prochaine instruction de bytecode à exécuter

Lorsque le thread exécute une méthode native

Valeur du PC est indéfinie

Middleware et Applications aDaptables

1. JVM

44

Méthodes natives vs. méthodes Java

Méthode Java

Écrite dans le langage Java

Compilée vers du bytecode

Stockée dans un fichier .class

Méthode native

Stockée dans un fichier .class Méthode native Écrite dans un autre langage que Java (C/C++, assembleur)

Écrite dans un autre langage que Java (C/C++, assembleur) Compilée vers le langage natif de la machine sous-jacente Stockée dans une librairie chargée dynamiquement lors de l’invocation d’une méthode native par un programme Java Interface JNI (Java Native Interface) : interaction entre code Java et code natif

native par un programme Java Interface JNI ( Java Native Interface ) : interaction entre code
native par un programme Java Interface JNI ( Java Native Interface ) : interaction entre code
native par un programme Java Interface JNI ( Java Native Interface ) : interaction entre code

Pile de méthodes natives

Thread Java appelle une méthode native

Pile Java du thread laissée de côté Utilisation de la pile de méthodes natives

de côté Utilisation de la pile de méthodes natives Structure de la pile de méthodes natives

Structure de la pile de méthodes natives non définie par la spécification de la JVM

E

B

A

P

fra m e J a v a fra m e n a tif D fra
fra m
e
J a v a
fra m
e
n a tif
D
fra m
e
n a tif
C
fra m
e
J a v a
fra m
e
J a v a
P
ile
d e
m
é th o d e s
ile s
J a v a
n a tiv e s

Middleware et Applications aDaptables

1. JVM

45

Middleware et Applications aDaptables

1. JVM

46

JVM : une des trois entités …

 

Mise en œuvre concrète de la JVM

JVM : une des trois entités …   Mise en œuvre concrète de la JVM

Spécification abstraite

Plusieurs mises en œuvre de JVM existent Pour plusieurs plates-formes Mises en œuvre

Mise en œuvre concrète

 

entièrement logicielles combinaison de mises en œuvre logicielle et matérielle

Instance d’exécution

 

Exemples de mises en œuvre de JVM

 

Middleware et Applications aDaptables

1. JVM

47

Middleware et Applications aDaptables

1. JVM

48

JDK (J2SDK) Kaffe J

i

Exemples de mises en œuvre concrètes de JVM (1 / 2)

Exemples de mises en œuvre concrètes de JVM (1 / 2) Exemples de mises en œuvre

Exemples de mises en œuvre concrètes de JVM (2 / 2)

/ 2) Exemples de mises en œuvre concrètes de JVM (2 / 2) JDK KVM  

JDK

KVM

 

fourni par Sun

une JVM "light" pour terminaux mobiles (téléphones, PDA)

sous-système d’exécution basé sur un interprète, compilation JIT

sous-système d’exécution basé sur un interprète

 

et optimisation adaptative

certaines restrictions par rapport au langage Java / API Java

 

utilisable sur plusieurs plates-formes : Linux, Solaris, Windows, Mac OS

(types float et double non supportés)

Kaffe

 

distribuée en logiciel libre

JavaCard

sous-système d’exécution basé sur un interprète, compilation JIT

une JVM embarquée sur une carte à puce

utilisable sur plusieurs plates-formes : Linux, Solaris, Windows

sous-système d’exécution basé sur un interprète

picoJava

 

un sous-ensemble du langage Java et de la JVM

fourni par Sun

pas de threads multiples, chargement dynamique de classes

mise en œuvre partiellement matérielle de la JVM

Microprocesseur avec le bytecode pour langage machine

Middleware et Applications aDaptables

1. JVM

49

Middleware et Applications aDaptables

1. JVM

50

JVM : une des trois entités …

   

Instance d’exécution de la JVM

JVM : une des trois entités …     Instance d’exécution de la JVM
 

Lorsqu’une application Java est lancée, une instance d’exécution de la JVM est créée

Spécification abstraite

L’application Java s’exécute au sein de cette instance

Mise en œuvre concrète

 

Instance d’exécution de la JVM commence par l’exécution de la méthode main d’une classe

 

Méthode main : point d’entrée pour le lancement du thread initial de l’application

Instance d’exécution

Par la suite, d’autres threads peuvent être créés

Lorsque tous les threads se terminent, l’instance d’exécution de la JVM se termine

Middleware et Applications aDaptables

1. JVM

51

Middleware et Applications aDaptables

1. JVM

52

Plan

Plan 1. JVM : une infrastructure middleware pour environnements hétérogènes 2. Exemple d’illustration

1.

JVM : une infrastructure middleware pour environnements hétérogènes

2.

Exemple d’illustration

3.

BCEL : adaptation de bytecode Java

4.

Javassist : adaptation de code Java

Exemple d’illustration

Exemple

Code source Java

Bytecode correspondant

Exemple Code source Java Bytecode correspondant Exécution et structure de données associées Middleware et

Exécution et structure de données associées

Middleware et Applications aDaptables

5.

Synthèse et Références

JVM / Adaptation de bytecode

 

53

Middleware et Applications aDaptables

2. Exemple d'illustration

54

Code source Java

     

Bytecode

Code source Java       Bytecode
   

cla ss

In tV a lu e

{

v

o id

add (in t

p lu s )

{

Compilation

 

0

v

a lu e

=

1

1

va lu e

 

//

V a ria b le

 

2

+

p lu s ;

javac IntValue.java Génération du fichier IntValue.class

 

in t

v a lu e ;

}

// C o n stru cto r

in t

sub (in t

m in u s )

{

in itia lV a lu e )

{

 
0 a

0

a

d d (-m in u s );

 
 

In tV a lu e (in t v a lu e

=

in itia lV a lu e ;

}

}

//

M a in

m e th o d

 

Désassemblage

 

//

in t

M e th o d s g e tIn tV a lu e ()

{

re tu rn

va lu e ;

 

p

u b lic

s ta tic

v o id

m a in (

 

S

In

trin g []

tV a lu e

a rg s )

v a l;

{

javap –c IntValue.class Génération du bytecode correspondant

 

}

0

v

a l

=

n e w

In tV a lu e (5 );

 
1 } v

1

}

v

a l.s u b (2 );

 

v o id

s e tIn tV a lu e (in t

n e w V a lu e )

{

 

}

v a lu e

=

n e w V a lu e ;

} v a lu e = n e w V a lu e ; }

}

Middleware et Applications aDaptables

2. Exemple d'illustration

 

55

Middleware et Applications aDaptables

2. Exemple d'illustration

56

Bytecode

 
Bytecode   Exécution  

Exécution

 
Bytecode   Exécution  

M

ethod In tV alu e (in t)

 

2

pu tfield #7

<F ie ld

int

M

eth o d

vo id sub (in t)

 

0

alo ad_0

va lue >

 

0

alo ad _0

1

invo kesp ecial #3

 

5

return

1 iloa d_ 1

 

<M ethod ja va.lang .O bject()>

alo ad_0

iloa d_ 1

     

2 ine g

 

4

5

M eth o d

void m ain (

java.lan g.S trin g [])

0

ne w

#1 <C lass

In tV a lue>

 
g []) 0 ne w #1 <C lass In tV a lue>   3 invo kevirtua

3

invo kevirtua l #5

< M e thod

add (in t)>

vo id

   
#1 <C lass In tV a lue>   3 invo kevirtua l #5 < M e

6

9

pu tfield

#7

value >

return

<F ie ld

in t

 

3

4

dup

icon st_5

 

M

6 return

eth o d

vo id add (in t)

   
pile d’opérandes
pile
d’opérandes

new

new

0

réf

 
 

5

invo kesp ecia l #4

 

0

alo ad _0

     

M

eth o d

in t

 

<M ethod In tV a lue(in t)>

 
M eth o d in t   <M ethod In tV a lue(in t)>   1

1

dup

 

frame

M eth o d in t   <M ethod In tV a lue(in t)>   1
 
M eth o d in t   <M ethod In tV a lue(in t)>   1

g etIn tV alu e ()

 

2

ge tfield

#7

<F ie ld

in t

 

0

alo ad_0

8

astore_1

 

value >

 

de

1

ge tfield

#7

<F ie ld

in t

 

9

alo ad _1

5 iloa d_ 1

main

   
 

va lue>

1

0 ico nst_2

6 iad d

 

?

 

val

 

?

val

 

4

ire turn

  4 ire turn 1 1 in vokevirtu al #6   7 #7 pu tfield <F

1 1 in vokevirtu al #6

 

7 #7

pu tfield

<F ie ld

in t

variables

1

1

M

eth o d

setIn tV alu e (in t)

vo id

 

1

<M ethod

vo id sub(int)>

4 return

 

value > 1 0 return

 
1 <M ethod vo id sub(int)> 4 return   value > 1 0 return   locales

locales

0

null

args

0

null

args

0 alo ad_0

   

(a)

 

(b)

1 iloa d_ 1

Middleware et Applications aDaptables

 

2. Exemple d'illustration

 

57

Middleware et Applications aDaptables

 

2. Exemple d'illustration

 

58

Exécution

   

Exécution

 
Exécution     Exécution  
 
   
 
 
    2   5
 

2

 

5

 

1

 

réf

1

réf

 

invoke

 
  1   réf 1 réf   invoke    
 
 

dup

0

 

réf

iconst_5

 

0

réf

   

special

special

0

 

réf

astore_1

1

0

réf null
réf
null
 
   
 
   
 
   
   
           
 
           
   
           
 
 

1

 

?

val

1

 

?

val

 

1

 

?

val

val

0

 

null

args

0

null

args

0

null

args

args

 

(c)

 

(d)

(e)

(f)

Middleware et Applications aDaptables

 

2. Exemple d'illustration

 

59

Middleware et Applications aDaptables

 

2. Exemple d'illustration

 

60

Exécution

Exécution Exécution pile d’opérandes invoke virtual frame de 1 2 1 2 pile 1 minus sub

Exécution

Exécution Exécution pile d’opérandes invoke virtual frame de 1 2 1 2 pile 1 minus sub
pile d’opérandes invoke virtual frame de 1 2 1 2 pile 1 minus sub variables
pile d’opérandes
invoke
virtual
frame
de
1
2
1
2
pile
1
minus
sub
variables
aload_1
iconst_2
d’opérandes
0
réf
0
réf
locales
0
réf
0
this
frame
de
main
réf
réf
1
val
1
val
réf
variables
1
val
0
null
args
0
null
locales
args
0
null
args
(g)
(h)
(i)
Middleware et Applications aDaptables
2. Exemple d'illustration
61
Middleware et Applications aDaptables
2. Exemple d'illustration
62
Exécution
Exécution
frame de
pile
add
d’opérandes
-2
1
pile
variables
1
plus = -2
1
pile
réf
0
d’opérandes
frame de
locales
0
this = réf
0
d’opérandes
frame de
sub
sub
(PC = 3)
(PC = 3)
pile
1
minus = 2
1
variables
pile
1
minus = 2
1
variables
d’opérandes
0
this = réf
0
locales
this = réf
0
locales
d’opérandes
0
frame de
frame de
main
main
(PC = 11)
(PC = 11)
variables
variables
1
val = réf
1
val = réf
locales
locales
0
args = null
0
args = null
(j)
(k)
Middleware et Applications aDaptables
2. Exemple d'illustration
63
Middleware et Applications aDaptables
2. Exemple d'illustration
64

Exécution

Exécution frame de add (PC = 2) frame de main (PC = 11) pile 1 5

frame de

add

(PC = 2)

frame de

main

(PC = 11)

Exécution frame de add (PC = 2) frame de main (PC = 11) pile 1 5

pile

1

5

 

d’opérandes

0

réf

 
 

variables

1

plus = -2

1

pile

locales

0

this = réf

0

d’opérandes

 
   
 

pile

1

minus = 2

1

variables

d’opérandes

0

this = réf

0

locales

 
   
 

variables

1

val = réf

locales

0

args = null

frame de

sub

(PC = 3)

(l)

locales 0 args = null frame de sub (PC = 3) (l) Plan 1. JVM :

Plan

locales 0 args = null frame de sub (PC = 3) (l) Plan 1. JVM :

1.

JVM : une infrastructure middleware pour environnements hétérogènes

2.

Exemple d’illustration

3.

BCEL : adaptation de bytecode Java

4.

Javassist : adaptation de code Java

Middleware et Applications aDaptables

2. Exemple d'illustration

65

5.

Middleware et Applications aDaptables

Synthèse et Références

JVM / Adaptation de bytecode

66

BCEL : Motivations

 

Exemple

BCEL : Motivations   Exemple

Extension et amélioration des programmes Java

 
     

Manipulation et transformation de bytecode

Manipulation et transformation de bytecode

après la compilation Java ou lors du chargement dynamique des classes

BCEL fournit une API qui permet de mettre en œuvre ses propres transformations de bytecode

mettre en œuvre ses propres transformations de bytecode Middleware et Applications aDaptables 3. BCEL 67
mettre en œuvre ses propres transformations de bytecode Middleware et Applications aDaptables 3. BCEL 67

Middleware et Applications aDaptables

3. BCEL

67

Middleware et Applications aDaptables

3. BCEL

68

Exemple

Exemple Middleware et Applications aDaptables 3. BCEL 69 API de BCEL Trois parties principales Package de

Middleware et Applications aDaptables

3. BCEL

Exemple Middleware et Applications aDaptables 3. BCEL 69 API de BCEL Trois parties principales Package de

69

API de BCEL

Trois parties principales

aDaptables 3. BCEL 69 API de BCEL Trois parties principales Package de description statique Package de

Package de description statique

Package de modification dynamique

Package d’exemples et d’utilitaires

Middleware et Applications aDaptables

3. BCEL

70

API de BCEL :

Package de description statique

décrit le format des fichiers de classes

statique décrit le format des fichiers de classes pour la lecture/écriture de fichiers de classes pas

pour la lecture/écriture de fichiers de classes

pas pour la modification du bytecode

utile pour l’analyse de classes principale classe JavaClass

Middleware et Applications aDaptables

3. BCEL

71

Exemples de classes

JavaClass

aDaptables 3. BCEL 71 Exemples de classes JavaClass public String getClassName() public ConstantPool

public String getClassName() public ConstantPool getConstantPool() public Field[] getFields() public Method[] getMethods()

String getClassName() public ConstantPool getConstantPool() public Field[] getFields() public Method[] getMethods()
String getClassName() public ConstantPool getConstantPool() public Field[] getFields() public Method[] getMethods()
String getClassName() public ConstantPool getConstantPool() public Field[] getFields() public Method[] getMethods()

Method

public LocalVariableTable getLocalVariableTable() public ExceptionTable getExceptionTable()

public LocalVariableTable getLocalVariableTable() public ExceptionTable getExceptionTable()

Middleware et Applications aDaptables

3. BCEL

72

JavaClass

JavaClass Middleware et Applications aDaptables 3. BCEL 73 Lecture d’un fichier de classe JavaClass clazz =
JavaClass Middleware et Applications aDaptables 3. BCEL 73 Lecture d’un fichier de classe JavaClass clazz =

Middleware et Applications aDaptables

3. BCEL

73

JavaClass Middleware et Applications aDaptables 3. BCEL 73 Lecture d’un fichier de classe JavaClass clazz =

Lecture d’un fichier de classe

JavaClass clazz = Repository.lookupClass("java.lang.String");

JavaClass clazz = Repository.lookupClass("java.lang.String");

System.out.println(clazz); System.out.println(clazz);

printCode(clazz.getMethods()); printCode(clazz.getMethods());

public public static static void void printCode(Method[] printCode(Method[] methods) methods) { {

for(int for(int i=0; i=0; i i < < methods.length; methods.length; i++) i++) { {

System.out.println(methods[i]); System.out.println(methods[i]);

Code Code code code = = methods[i].getCode(); methods[i].getCode();

if(code if(code != != null) null)

// // Non-abstract Non-abstract method method

System.out.println(code); System.out.println(code);

} }

} }

Middleware et Applications aDaptables

3. BCEL

74

API de BCEL : Package de modification dynamique

3. BCEL 74 API de BCEL : Package de modification dynamique modification dynamique d’objets JavaClass ou

modification dynamique d’objets JavaClass ou Method

pour l’insertion de code d’analyse

pour la mise en œuvre de back-end de compilateur Java

Middleware et Applications aDaptables

3. BCEL

75

Modification de classe

Middleware et Applications aDaptables 3. BCEL 75 Modification de classe Middleware et Applications aDaptables 3. BCEL
Middleware et Applications aDaptables 3. BCEL 75 Modification de classe Middleware et Applications aDaptables 3. BCEL

Middleware et Applications aDaptables

3. BCEL

76

API de BCEL : Package d’exemples et d’utilitaires

API de BCEL : Package d’exemples et d’utilitaires plusieurs exemples de code utilisant BCEL plusieurs utilitaires

plusieurs exemples de code utilisant BCEL

plusieurs utilitaires

viewer de fichier de classe

outil de conversion d’un fichier de classe en HTML

Middleware et Applications aDaptables

3. BCEL

77

Plan

HTML Middleware et Applications aDaptables 3. BCEL 77 Plan 1. JVM : une infrastructure middleware pour

1.

JVM : une infrastructure middleware pour environnements hétérogènes

2.

Exemple d’illustration

3.

BCEL : adaptation de bytecode Java

4.

Javassist : adaptation de code Java

5.

Synthèse et Références

Middleware et Applications aDaptables

JVM / Adaptation de bytecode

78

Javassist : Motivations

JVM / Adaptation de bytecode 78 Javassist : Motivations Manipulation et transformation de programmes Java (idem

Manipulation et transformation de programmes Java (idem BCEL)

après la compilation Java ou lors du chargement dynamique des classes

après la compilation Java ou lors du chargement dynamique des classes

BCEL exprime les transformations faites à un programme Java en bytecode

Javassist exprime les transformations faites à un programme Java dans le langage source Java

Middleware et Applications aDaptables

4. Javassist

79

Javassist : Exemple 1

Modification de l’héritage d’une classe

: Exemple 1 Modification de l’héritage d’une classe ClassPool pool = ClassPool.getDefault(); CtClass cc =

ClassPool pool = ClassPool.getDefault();

CtClass cc = pool.get("test.Rectangle");

cc.setSuperclass(pool.get("test.Point"));

cc.writeFile();

Middleware et Applications aDaptables

4. Javassist

80

Javassist : Exemple 2

Définition d’une nouvelle classe

Javassist : Exemple 2 Définition d’une nouvelle classe ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.

ClassPool pool = ClassPool.getDefault();

CtClass cc = pool.makeClass("Point");

Javassist : Exemple 3

= pool. makeClass ("Point"); Javassist : Exemple 3 Insertion de pré-traitement dans une méthode public class

Insertion de pré-traitement dans une méthode

public class Hello { public void say() { System.out.println("Hello");

}

}

public class Test { public static void main(String[] args) throws Exception { ClassPool cp = ClassPool.getDefault(); CtClass cc = cp.get("Hello"); CtMethod m = cc.getDeclaredMethod("say"); m.insertBefore("{ System.out.println(\"Hello.say():\"); }"); Class c = cc.toClass(); Hello h = (Hello)c.newInstance(); h.say();

}

}

Middleware et Applications aDaptables

4. Javassist

81

Middleware et Applications aDaptables

4. Javassist

82

Javassist : Exemple 4

 

Synthèse

Javassist : Exemple 4   Synthèse

Accès aux paramètres d’une méthode

 

JVM

 

class Point { int x, y; void move(int dx, int dy) { x += dx; y += dy;

}

une infrastructure middleware pour environnements hétérogènes

Adaptation de bytecode

}

BCEL : une librairie de manipulation de programmes Java en bytecode

Javassist : une librairie de manipulation de programmes Java en langage source Java

ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.get("Point"); CtMethod m = cc.getDeclaredMethod("move"); m.insertBefore("{ System.out.println($1); System.out.println($2); }"); cc.writeFile();

Middleware et Applications aDaptables

4. Javassist

83

Middleware et Applications aDaptables

5. Synthèse et Références

84

Synthèse :

Réflexivité Java, AspectJ, BCEL

Synthèse : Réflexivité Java, AspectJ, BCEL Réflexivité Java (package java.lang.reflect ) Accès aux types des

Réflexivité Java (package java.lang.reflect)

Accès aux types des paramètres d’une méthode

 

public Method[ ] java.lang.Class.getMethods() public Class[ ] java.lang.reflect.Method.getParameterTypes()

AspectJ

 

Accès aux types et valeurs des paramètres d’une méthode

BCEL

Accès aux types et valeurs des paramètres et variables locales à une méthode

Middleware et Applications aDaptables

5. Synthèse et Références

85

Synthèse

Comparaison de BCEL et AspectJ

et Références 85 Synthèse Comparaison de BCEL et AspectJ BCEL   librairie de bas niveau manipulation

BCEL

 

librairie de bas niveau manipulation de bytecode nécessite connaissance de la JVM

permet de construire différents outils de plus haut niveau (optimisation des programmes, analyse statique, AOP, etc.)

AspectJ

technique de plus haut niveau abstractions (join points, pointcuts, advices)

utilisation plus aisée (ne nécessite pas la connaissance de la JVM)

mais moins de liberté qu’avec BCEL

Middleware et Applications aDaptables

5. Synthèse et Références

86

Références Web

Spécification de la machine virtuelle Java :

http://java.sun.com/docs/books/vmspec/

Manipulation de bytecode :

Manipulation de bytecode : BCEL : http://jakarta.apache.org/bcel/ ou

BCEL : http://jakarta.apache.org/bcel/ ou http://bcel.sourceforge.net/ JikesBT : http://www.alphaworks.ibm.com/tech/jikesbt/ Javassist : http://www.csg.is.titech.ac.jp/~chiba/javassist/ ASM : http://asm.objectweb.org/ JOIE : http://www.cs.duke.edu/ari/joie/

ASM : http://asm.objectweb.org/ JOIE : http://www.cs.duke.edu/ari/joie/
ASM : http://asm.objectweb.org/ JOIE : http://www.cs.duke.edu/ari/joie/
ASM : http://asm.objectweb.org/ JOIE : http://www.cs.duke.edu/ari/joie/
ASM : http://asm.objectweb.org/ JOIE : http://www.cs.duke.edu/ari/joie/

Middleware et Applications aDaptables

5. Synthèse et Références

87

Références bibliographiques

Synthèse et Références 87 Références bibliographiques The Java Virtual Machine Specification (2nd Edition) , Tim

The Java Virtual Machine Specification (2nd Edition), Tim Lindholm, Franck Yellin, Addison Wesley, 1999.

Inside the Java Virtual Machine, Bill Venners, McGraw-Hill, 2000.

Programming for the Java Virtual Machine, Joshua Engel, Addison-Wesley, 1999

Java Virtual Machine, Jon Meyer, Troy Downing, O’Reilly & Associates, 1997

Mobilité et Persistance des Applications dans l’Environnement

Java – Chapitre 2, Sara Bouchenak, Thèse de Doctorat de l’INPG,

2001.

Middleware et Applications aDaptables

5. Synthèse et Références

88