2010-10-19 3 views
4

Est-il possible de trouver l'utilisation de la mémoire de l'objet dans Java dans l'application?Java Utilisation de la mémoire de l'objet - ibm jvm 1.4.2

Je souhaite que l'utilisation de la mémoire objet fasse partie de la sortie de débogage lors de l'exécution de l'application. Je ne souhaite pas me connecter en utilisant une application externe à une machine virtuelle.

J'ai un problème que quelques classes mange énormément de mémoire et provoque des problèmes de mémoire , mon application se bloque. J'ai besoin de trouver cette utilisation de la mémoire (je travaille avec des ressources mémoire limitées).

EDIT: J'utilise java 1.4:/

+0

double possible de http://stackoverflow.com/questions/390449/determining-java-memory-usage – nc3b

+0

@ nc3b ce lien traite plus d'environ 1,5. Bien que cela vaut la peine de noter est que l'URL: http://www.javamex.com/tutorials/memory/instrumentation.shtml. J'adorerais avoir ça dans mon java:/ – Gadolin

Répondre

0

Il existe des outils qui vient avec jdk tels que jmap et jhat qui fournit des détails au niveau de l'objet.

+0

Merci, malheureusement ce sont des outils externes. J'ai besoin d'obtenir cette information à l'intérieur comme indiqué. – Gadolin

1

Eclipse MAT est un très bon outil pour analyser la mémoire.

+0

Merci, cela semble bien mais c'est un outil externe. Ce que j'ai trouvé sur leur page http://wiki.eclipse.org/index.php/MemoryAnalyzer est Si vous exécutez votre application avec le flag VM -XX: + HeapDumpOnOutOfMemoryError, un vidage de tas est écrit sur la première erreur Out Of Memory .. Bien que je doute qu'il sera pris en charge dans mon java. – Gadolin

6

Voir mon projet favori, MemoryMeasurer. Un petit exemple:

long memory = MemoryMeasurer.measureBytes(new HashMap()); 

Vous pouvez également tirer répartition de la mémoire plus qualitative:

Footprint footprint = ObjectGraphMeasurer.measure(new HashMap()); 

Par exemple, j'utilisé ce dernier pour obtenir la per entry cost of various data structures, où la tête est mesurée en nombre d'objets créés, références, et primitives, au lieu de seulement des octets (ce qui est également faisable). Ainsi, la prochaine fois que vous utiliserez un (par défaut) HashSet, vous pouvez être informé que chaque élément coûte 1 nouvel objet (pas votre élément), 5 références et un int, ce qui correspond exactement au coût d'une entrée dans HashMap (pas de façon inattendue, puisque tout élément HashSet finit dans un HashMap), et ainsi de suite.

Vous pouvez l'utiliser sur n'importe quel graphe d'objet. Si votre graphe d'objet contient des liens d'autres structures que vous souhaitez ignorer, vous devez utiliser un prédicat pour éviter de les explorer.

ModifierInstrumentation n'est pas disponible pour Java 1.4 (wow, les gens utilisent encore cette ?!), donc au-dessus de l'appel memoryBytes ne fonctionnerait pas pour vous. Mais le second le ferait. Ensuite, vous pouvez écrire quelque chose comme ça (si vous êtes sur une machine 32 bits):

long memory = footprint.getObjects() * 8 + footprint.getReferences() * 4 + 
       footprint.getPrimitives().count(int.class) * 4 + 
       footprint.getPrimitives().count(long.class) * 8 + ...; 

Cela vous donne une approximation. Une meilleure réponse serait de Ceil cela le plus proche multiple de 16:

long alignedMemory = (x + 15) & (~0xF); //the last part zeros the lowest 4 bits 

Mais la réponse peut-être encore loin, car si vous trouvez, par exemple, 16 booléens, il est une chose si elles se trouvent dans le même objet, et tout à fait une autre si elles sont réparties dans plusieurs objets (et provoquent une utilisation excessive de l'espace en raison de l'alignement). Cette logique pourrait être implémentée comme visitor (similaire à comment MemoryMeasurer et ObjectGraphMeasurer sont mises en œuvre - tout simplement comme vous pouvez le voir), mais je n'ai pas dérangé, puisque c'est ce que fait Instrumentation, donc cela n'aurait de sens que pour les versions Java inférieures à 1.5 .

+0

Bel outil, mais je dois vérifier la compatibilité 1.4. – Gadolin

+0

Voir la modification puis :) –

+0

+1, intéressant. –