2011-02-18 3 views
2

Obtention d'une erreur inférieure à Eclipse.comment résoudre java.lang.OutOfMemoryError

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space. 

quelqu'un peut-il savoir que la façon de résoudre ce problème?

Cordialement,
Mahendra Athneria

+0

Avez-vous essayé d'augmenter l'espace mémoire? Peut-être avez-vous besoin de beaucoup de mémoire (les valeurs par défaut sont plutôt faibles) –

+0

Il serait utile de pouvoir ajouter une trace de pile. Il est impossible de diagnostiquer la cause avec des informations données. –

+0

duplication possible de [Comment faire face à "java.lang.OutOfMemoryError: espace de tas Java" erreur (taille de segment de 64 Mo)] (http://stackoverflow.com/questions/37335/how-to-deal-with-java- lang-outofmemoryerror-java-heap-espace-erreur-64mb-tas) – Mark

Répondre

0

Au lieu de forcer System.gc() comme suggéré @keatch je pense qu'il est préférable de savoir ce qui est la fuite de mémoire. Il y a un outil jHat (Java Heap Analysis Tool) qui peut aider à trouver la cause du problème.

Here est une explication comment faire un vidage de tas.

4

Utilisez moins de mémoire.

Il est difficile de dire exactement quel est le problème sans savoir quel type d'application vous utilisez. Donc, cette réponse va juste contenir des conseils généraux pour traiter ce problème.

Utilisez l'application jvisualvm fournie avec le kit JDK. Cela vous permettra de vous connecter à un processus en cours et de voir comment la mémoire est utilisée.

Regardez dans les résultats pour un grand nombre d'objets qui ne devraient pas s'y trouver. Si vous voyez qu'il y a 20 000 instances d'une classe, faites le calcul et voyez s'il devrait y en avoir autant. Recherchez les types d'objets qui ont plus d'instances qu'il ne devrait en réalité y en avoir. Ensuite, vous devez comprendre pourquoi vous en avez tellement.

Ces objets supplémentaires sont probablement créés et ne sont pas correctement déréférencés. Vous pouvez les mettre dans une structure de données quelque part et ne pas les supprimer. Vous pouvez avoir des threads qui sont toujours en cours d'exécution qui référencent ces données qui ne se terminent pas comme ils le devraient. Il y a toutes sortes de raisons pour lesquelles vous continuez à référencer des données qui devraient être collectées. L'information clé est de savoir quelle classe d'objets est en train d'exploser en quantité comme celle-ci. Une fois que vous le savez, vous pouvez remplacer le constructeur et le destructeur de cette classe pour enregistrer le nombre d'entre eux ont été créés et détruits, et où. En filtrant ces données, vous pouvez déterminer où les objets supplémentaires sont créés ou s'ils ne sont pas détruits. Une fois que vous aurez corrigé ce problème, vous arrêterez d'obtenir l'erreur.

Bien sûr, il est également tout à fait possible que les données que vous traitez aient réellement besoin de cette quantité de mémoire. Vous ne nous avez rien dit sur votre projet, il est donc impossible d'en juger avec précision. Si tel est le cas, vous devez déterminer comment partitionner les données pour n'en charger qu'une partie à la fois, les traiter, les libérer de la mémoire, puis passer au segment de données suivant.

J'ai eu ces problèmes avant et utilisé toutes les techniques ci-dessus pour les résoudre.

1

Eclipse exécute-t-il de la mémoire ou une application que vous utilisez depuis eclipse? En supposant que ce ne soit pas une fuite de mémoire et que vous ayez juste besoin de plus de mémoire, vous pouvez modifier les arguments VM transmis à une application s'exécutant à l'intérieur d'éclipse. Exécuter les configurations -> Arguments VM -> -Xmx512m

Si le problème est Eclipse, vous pouvez modifier le fichier de paramètres eclipse.ini et modifier l'argument -Xmx.Cependant, si vous avez une fuite de mémoire, l'augmentation de la taille maximale du segment de mémoire ne fera que masquer le problème un peu plus longtemps.

Questions connexes