2009-09-28 4 views
2

Nous avons un problème de fuite de mémoire étrange avec un processus Java en cours d'exécution dans Linux a une utilisation de swap toujours croissant. Donc, naturellement, nous avons regardé le tas de mémoire et avons également utilisé un profileur pour le surveiller sur une période de temps. Nous avons constaté queQuels sont les outils qui peuvent analyser l'utilisation de la mémoire en dehors du tas dans Java?

1) Le nombre de threads ne pousse pas
2) L'utilisation du tas ne pousse pas
3) Cependant, l'utilisation (VIRT) ne cesse de croître (qui peut devenir un problème parce que le système commence à courir hors de l'espace de swap)

Maintenant, il y a une tonne d'outils qui peuvent vider le tas ou surveiller le tas mais aucun pour la mémoire en dehors du tas. Quelqu'un a des idées? PS Il s'agit d'un serveur distant, nous n'avons accès à aucune interface graphique.

+0

Quelle JVM/version utilisez-vous? C'est peu probable mais peut-être en essayer un autre juste pour exclure un bug de la JVM. – leonm

+0

J'ai essayé openjdk et le JDK de Sun, les deux mêmes résultats sous Linux. – erotsppa

Répondre

0

Est-ce que 1) l'espace mémoire du processus ne change pas, mais 2) l'utilisation de l'échange change-t-elle pour indiquer qu'un autre processus sur la boîte peut être responsable de la croissance soudaine de la mémoire? En d'autres termes, je pensais que quelque chose comme l'utilisation de swap était régulé par le système d'exploitation - donc si l'utilisation du tas par un processus Java ne change pas mais que l'utilisation du swap le fait, cela semble indiquer que le problème ailleurs, et il se trouve que le système d'exploitation choisit votre processus Java pour commencer à manger de l'espace de swap. Ou ai-je une mauvaise compréhension de l'espace d'échange?

+0

J'ai clarifié la question. Fondamentalement, ce que je dis est que le VIRT du processus ne cesse de croître. Ce qui signifie que la mémoire totale réclamée par le processus augmente. Juste que la partie du tas ne grandit pas. – erotsppa

1

Vous pourriez avoir des fuites dans la mémoire native, comme les Sockets. Y a-t-il beaucoup de connexions en cours, et fermez-vous les connexions dans un bloc finally?

0

Les autres parties de la mémoire JVM augmentent-elles? Par exemple l'espace permgen?

Utilisez-vous des bibliothèques natives (JNI)?

0

Je vais essayer de répondre en répondant à une autre question. Est-il possible que la configuration de la taille de tas de la JVM soit plus que la mémoire physique libre dont vous disposez? Même si vous définissez la taille initiale du tas beaucoup plus petite que la taille maximale du tas, et que la JVM alloue le tout, elle ne le renvoie jamais au système d'exploitation, même si vous le ramassez tous et que vous n'avez plus d'allocations. Ne confiugre pas 1,5 Go maximum de mémoire sur un serveur RAM 1G. Veuillez vérifier que la taille de tas maximale configurée "entre" la RAM libre que vous avez, avec d'autres processus, surtout s'il s'agit d'une application serveur. Sinon, votre application recevra beaucoup de fautes de page et changera tout le temps.

Questions connexes