PRATIQUE JAVA 
Connaître l'espace mémoire occupé par un objet
 
Trois méthodes existent pour déterminer la taille d'un objet en mémoire, et ainsi évaluer la pertinence du code et les performances de l'application. (24/07/2006)
  Forum

Réagissez dans les forums de JDN Développeurs

Parce que Java gère seul le plus gros du fonctionnement de la mémoire, notamment par le biais du ramasse-miettes, le langage ne dispose pas de méthode directe pour déterminer la place occupée par une instance de classe - là où le langage C, par exemple, propose l'opérateur sizeOf().

Java ne propose que trois méthodes donnant accès à l'espace mémoire, toutes situées dans la classe Runtime, qui crée une interface entre l'application et son environnement. Chaque application utilise implicitement son instance de Runtime. Les trois méthodes sont freeMemory(), qui renvoie l'espace mémoire libre ; maxMemory(), qui renvoie l'espace maximal que la JVM tentera d'utiliser ; et totalMemory(), qui renvoie l'espace total disponible au sein de la JVM.

À partir de ces méthodes, on pourrait deviner la place occupée par un objet en comparant la mémoire libre avant et après sont instanciation, mais chaque implémentation de la JVM, voire même chaque lancement d'icelle, tend à ne pas réserver le même espace mémoire pour ses applications - sans compter que la JVM peut décider d'augmenter cette valeur pour le tas à n'importe quel moment, ou de lancer le ramasse-miettes au moment du test... Déterminer de manière cohérente et portable la taille d'un objet requiert alors plus de travail.

On peut donc à un premier niveau évaluer l'espace et extrapoler à partir de là, ou, comme le propose Martin Roth, minimiser les risques de ramassage automatique en instanciant un grand nombre d'objets. Vladimir Roubtsov, de son côté, provoque le lancement du ramassage automatique autant que faire ce peut, puis mesure la taille du tas avant et après l'instanciation. C'est également la méthode proposée par Heinz M. Kabutz.

Retenez qu'au final, aucune des méthodes n'est sûre à 100% pour toutes les JVM, mais quand les données qui transitent en mémoire se chiffrent en milliers de méga-octets, même une simple extrapolation peut déterminer l'espace nécessaire à une application, et savoir ainsi si votre usage mémoire est efficace, ou s'il devient nécessaire de revoir votre code...
 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page