2011-07-04 2 views
0

J'ai rencontré un problème de mémoire dans mon application.Quelles sont les causes possibles de "java.lang.OutofMemoryError" dans un thread en cours d'exécution?

Dans l'une de mes exécutions de threads, il y a un java.lang.OutofMemoryError soudain et faire mourir les threads.

J'ai déjà sélectionné la taille du tas mémoire pour l'application est 20M. J'ai jeté l'utilisation de la mémoire pour l'ensemble de l'application avant et après ce MOO sur ce thread se produit, il ne dépasse pas 20M.

Je ne sais pas comment résoudre ce problème.

Alors, quelles sont les causes possibles de cela java.lang.OutofMemoryError? et y a-t-il une méthode à prendre si je ne connais pas la raison exacte?

Voici ce que j'ai! Avant cette utilisation de la mémoire de l'application est 8M

après cette utilisation de la mémoire de l'application est également 8M.

+1

Il existe de nombreuses causes potentielles. Dans un premier temps, pourriez-vous poster les détails de l'erreur; dites la cause. – kipz

+0

OOM se produit généralement lorsque vous essayez d'allouer un bloc de mémoire qui ne peut pas entrer dans une région contiguë du tas. Donc, avoir votre utilisation totale de la mémoire <20M ne signifie pas que vous n'obtiendrez pas (ou ne devriez pas) obtenir une exception de MOO. Pouvez-vous poster du code et la trace de la pile? – dlev

+0

Sur quelle version de Java travaillez-vous? Les versions plus récentes vous permettent de capturer plus d'informations. Vous pouvez également essayer d'ajouter -XX: + HeapDumpOnOutOfMemoryError à votre commande java pour produire un vidage de tas lorsque l'erreur se produit. – developmentalinsanity

Répondre

1

La cause est que vous manquez de mémoire. Cela pourrait cependant être l'un de plusieurs types donc le message exact est important.

Vous pouvez joindre à votre programme en cours d'exécution avec jvisualvm (dans le JDK) et examiner l'arborescence des objets pour voir où la mémoire est allée. J'espère que vous pouvez déduire pourquoi il est encore utilisé (peut être aussi simple qu'un champ statique contenant une copie de la structure) et comment s'en débarrasser.

Lorsque vous avez trouvé cela, placez les clauses try-finally pour que la mémoire soit toujours libérée même si un MOO est lancé.

+0

Je sais que c'est trop en retard sur ce fil. Mais aucune idée de comment cela pourrait se produire alors que l'ensemble de l'application de la mémoire ne dépasse pas encore 20M. Est-ce qu'un thread a une taille de mémoire limitée qui est <20M? –

+0

Vous pourriez avoir un pic d'utilisation de la mémoire. Montre la pile de pile. –

+0

malchanceux, le stacktrace ne s'imprime pas pour moi. –

1

Probablement parce que vous n'avez pas donné assez de mémoire à votre application.

J'ai déjà sélectionné la taille de segment de mémoire pour l'application est 20M. J'ai jeté l'utilisation de la mémoire pour l'ensemble de l'application avant et après ce MOO sur ce thread se produit, il ne dépasse pas 20M.

La taille du segment ne sera jamais supérieure au maximum. C'est ce qui a un maximum de moyens. ;)

+0

je l'ai fait. parce que pour attaquer le MOO, j'essaie de vider l'utilisation de la mémoire pendant une période de temps. J'ai trouvé que avant et après le java.lang.OutofMemoryError se produit, l'utilisation de la mémoire sont seulement 8M. –

+0

Si vous tentez de créer un tableau comme 'new byte [longueur]' et que la longueur est égale ou supérieure à 12M, ce comportement est normal. Je regarderais la ligne de code où l'OOME se produit. –

Questions connexes