2010-07-16 5 views
1

Je travaille sur un grand système préexistant et je ne peux utiliser aucun des outils de profilage externes qui ont été mentionnés dans d'autres questions. Cela étant dit, y a-t-il une manière programmatique pour que java imprime les variables qui sont encore allouées et utilise l'espace mémoire? Le nom et le type de la variable seraient idéaux, mais toute information sur les variables d'identification serait utile.suivi de la mémoire par programmation en Java

Répondre

0
  1. Pour chaque classe, ajoutez un membre int statique (initialement zéro) de sorte qu'il soit incrémenté dans le constructeur et décrémenté dans le destructeur. Cela vous donne un nombre d'objets de chaque classe. (Vous devrez peut-être synchroniser le compteur inc/dec si le système est multithread)
  2. Imprimez les comptages d'objets de toutes les classes et Runtime.getRuntime().totalMemory() périodiquement.
+0

Parle-t-il d'utiliser la finalisation? :) – willcodejavaforfood

+0

J'ai fini par utiliser une légère variation de votre idée. Il y a beaucoup trop de classes pour faire ce que vous suggérez avec chacune d'elles mais j'ai plutôt ajouté le compteur à la classe dont toutes les boîtes de dialogue dans le système héritent. Cela m'a dit qu'il y avait des boîtes de dialogue en cours de création qui ne s'affichaient pas à l'écran. Après cela, j'ai fait une liste statique pour contenir les dialogues nouvellement créés (et les supprimer à la fin de la boîte de dialogue) – lathomas64

+0

@willcodejavaforfood: désolé pour les informations erronées, je suis un gars C++, ne réalisant pas qu'il n'y avait pas d'équivalent de destructeur en Java. – rwong

0

Avez-vous essayé VisualVM? C'est assez non intrusif, et devrait être en mesure de vous donner une bonne idée de l'utilisation de la mémoire. Dans le pire des cas, vous pouvez toujours tuer le projet et vous débarrasser du core dump (en supposant que vous utilisez un système d'exploitation prenant en charge les dumps core).

0

Faites attention à ne placer aucun code à l'intérieur finalisez, car tout code putant dans finalize pourrait augmenter la durée de vie de votre objet; en fait, dans des cas extrêmes, un objet peut ne jamais être enregistré.