2011-07-05 5 views
3

J'ai une application d'entreprise de printemps s'exécutant sur JDK 1.6 sous Windows 2008. L'application devient lente ou ne répond pas à des moments aléatoires. Je soupçonne qu'il y a une fuite de mémoire et que le GC se lance dans le lecteur.Résolution du problème de récupération de place intermittente - Java

Comment puis-je résoudre ce problème sans redémarrer la machine virtuelle Java à l'aide du paramètre java.exe -verbose: gc? Je ne peux vraiment pas arrêter cette application. Je prévois de faire AppDynamics dessus une fois que je pourrai le redémarrer mais pour savoir ce que je peux faire? Quelles sont mes options?

Répondre

3

Démarrez l'application et exécutez jconsole sur le PID. Alors que son fonctionnement regarde le tas dans la console. Quand il est proche des maxes, obtenez un tas de mémoire. Téléchargez Eclipse MAT et analysez le vidage de tas. Si vous remarquez que la taille du segment de mémoire retenue est nettement inférieure, le fichier binaire actuel analyse le vidage de tas avec -keep_unreachable_objects étant défini. Si ce dernier est vrai et que vous faites un GC complet, vous avez probablement une fuite. Gardez à l'esprit quand je dis fuite je ne parle pas d'une fuite où le GC ne peut pas retenir la mémoire, plutôt de la façon dont vous construisez de gros objets et les rends souvent inaccessibles pour que le CP consomme beaucoup de temps CPU.

Si vous voyez de véritables fuites de mémoire vous verriez GC sur la tête atteint des erreurs

+0

Notez que jvisualvm peut aider beaucoup de cela. –

+0

@Mat Banik Il n'y a pas de moyen clair d'obtenir le PID juste. En général, je démarre simplement l'application et je regarde quel nouveau fichier java.exe a démarré. Aussi celui qui a le plus de mémoire virtuelle pointe généralement vers où je regarde dans une telle situation –

Questions connexes