2012-05-25 3 views
1

J'ai un problème avec une application Java. Hier, quand je déployé à une série de tests, nous avons remarqué que notre machine ont commencé à délaisser, même si ce n'est pas une application réelle de monstre, si vous savez ce que je veux dire. Quoi qu'il en soit, j'ai vérifié les résultats de haut et vu qu'il mange autour de 100 Mo de mémoire (RES en haut) J'ai essayé de la mémoire et le profil de vérifier s'il y a une fuite de mémoire, mais je ne pouvais pas trouver un. Il y avait un PreparedStatement non fermé, que j'ai corrigé, mais cela ne voulait pas dire grand-chose. J'ai essayé régler le min et la taille de tas max (certains ont dit que la taille min de tas n'est pas nécessaire), et il n'a pas fait aucune différence.Java utilisation de la mémoire haute

Voici comment je lance maintenant:

#!/bin/sh 

$JAVA_HOME/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9025 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:MaxPermSize=40m -Xmx32M -cp ./jarName.jar uk.co.app.App app.properties 

Voici le résultat de top:

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                                           
16703 root  20 0 316m 109m 6048 S 0.0 20.8 0:14.80 java 

La chose que je ne comprends pas que je configure max PermSize et max Heap taille, qui ajoute jusqu'à 72mb. Ce qui est suffisant, l'application fonctionne bien. Pourquoi mange-t-il encore 109Mo de mémoire et qu'est-ce qui le mange? C'est une différence de 37mb, ce qui est assez élevé. (34%). Je ne pense pas que ce soit une fuite de mémoire, car max taille du tas est réglé et il n'y a pas d'erreur sur la mémoire, ou quoi que ce soit. Une chose intertesting peut-être que j'ai fait une décharge de tas avec VisualVM, puis vérifié avec EclipseMAT et il a dit qu'il y a une fuite possible dans un chargeur de classe. Voici ce qu'il dit:

Le classloader/composant "sun.misc.Launcher $ AppClassLoader @ 0x87efa40" (64,90 9,807,664 occupe%) octets. La mémoire est accumulée dans un cas de « court [] [] » chargé par « » .Keywords sun.misc.Launcher $ AppClassLoader @ 0x87efa40

Je ne peux pas faire beaucoup de cela, mais peut être utile.

Merci pour votre aide à l'avance.

EDIT

J'ai trouvé celui-ci, peut-être il n'y a rien que je peux faire ... Tomcat memory consumption is more than heap + permgen space

Répondre

1

Avez-vous essayez d'utiliser JConsole au profil de l'application http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html Sinon, vous pouvez également utiliser essai JProfiler version pour profiler l'application http://www.ej-technologies.com/products/jprofiler/overview.html?gclid=CKbk1p-Ym7ACFQ176wodgzy4YA

Cependant, la première étape pour vérifier l'utilisation de la mémoire haute devrait être de vérifier si vous êtes nous Si vous avez coché "oui", vérifiez s'ils gardent les références aux objets (même s'ils ne sont pas utilisés) avec eux.

+0

J'ai fait du profilage, comme je l'ai écrit, et je n'ai pas pu identifier de problèmes. –

+0

Nous vous recommandons d'essayer ces paramètres: -XX: MaxHeapFreeRatio et -XX: MinHeapFreeRatio. Voir plus de détails à http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html sous 'Options de performance' – Saurabh

4

mémoire Java comprend

  • l'espace de tas.
  • la perm gen espace
  • zones de pile de fil.
  • bibliothèques partagées, y compris celle de la JVM (sera partagée)
  • la taille de la mémoire directe.
  • la taille du fichier de mémoire mappée (sera partagée)

Il est susceptible d'être d'autres qui sont à usage interne. Étant donné que 37 Mo de mémoire PC vaut environ 20 cents, je ne m'inquiéterais pas trop. ;)

+0

Si je pouvais lancer 20 cents chaque fois que mon ordinateur a besoin de plus de mémoire, Je serais un pauvre homme ...;) – brimborium

+0

Je vois votre point, tout le point de mon inquiétude est que le serveur, qui exécute cette application a 512 Mo de RAM et si je cours cette application, la machine commence à échanger. Donc, ce 37 Mo est important dans la mesure où si je pouvais le réduire, cela m'aiderait. –

+0

Combien cela coûterait-il pour augmenter la mémoire? Cela vous aiderait aussi. –