J'obtiens l'erreur suivante lors de l'exécution d'un programme multi-thread
java.lang.OutOfMemoryError: Java heap space
L'erreur ci-dessus s'est produite dans l'un des threads.
À ma connaissance, l'espace de tas est occupé par des variables d'instance uniquement. Si cela est correct, alors pourquoi cette erreur s'est produite après une exécution correcte pendant un certain temps, car de l'espace pour les variables d'instance est alloué au moment de la création de l'objet.
Existe-t-il un moyen d'augmenter l'espace du tas?
Quelles modifications dois-je apporter à mon programme pour qu'il prenne moins d'espace sur le tas?
java
multithreading
out-of-memory
heap-memory
Yatendra Goel
la source
la source
Réponses:
Si vous souhaitez augmenter votre espace de tas, vous pouvez utiliser
java -Xms<initial heap size> -Xmx<maximum heap size>
sur la ligne de commande. Par défaut, les valeurs sont basées sur la version JRE et la configuration du système. Vous pouvez en savoir plus sur les options de VM sur le site Web Java .Cependant, je recommanderais de profiler votre application pour savoir pourquoi la taille de votre tas est consommée. NetBeans a un très bon profileur inclus avec lui. Je crois qu'il utilise le
jvisualvm
sous le capot. Avec un profileur, vous pouvez essayer de trouver où de nombreux objets sont créés, quand les objets sont récupérés, et plus encore.la source
1.- Oui, mais cela fait à peu près référence à toute la mémoire utilisée par votre programme.
2.- Oui, voir les options Java VM
C'est à dire
java -Xmx2g
attribuez 2 gigaoctets de RAM au maximum à votre applicationMais vous devriez voir si vous n'avez pas de fuite de mémoire en premier.
3.- Cela dépend du programme. Essayez de repérer les fuites de mémoire. Cette question serait trop difficile à répondre. Dernièrement, vous pouvez profiler en utilisant JConsole pour essayer de savoir où va votre mémoire
la source
Vous pouvez consulter ce site pour en savoir plus sur la mémoire dans la JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage
J'ai trouvé utile d'utiliser visualgc pour observer comment les différentes parties du modèle de mémoire se remplissent, pour déterminer ce qu'il faut changer.
Il est difficile de déterminer quelle partie de la mémoire a été remplie, donc visualgc, car vous voudrez peut-être simplement changer la partie qui a un problème, plutôt que de simplement dire,
Essayez d'être plus précis sur ce que vous faites, à long terme, vous trouverez probablement le programme meilleur pour cela.
Pour déterminer où se trouve la fuite de mémoire, vous pouvez utiliser des tests unitaires pour cela, en testant quelle était la mémoire avant le test et après, et s'il y a un changement trop important, vous pouvez l'examiner, mais vous devez effectuez la vérification pendant que votre test est toujours en cours.
la source
Pour augmenter la taille du tas, vous pouvez utiliser l'argument -Xmx lors du démarrage de Java; par exemple
la source
Vous pouvez obtenir la taille de la mémoire de votre tas via le programme ci-dessous.
puis en conséquence, vous pouvez également augmenter la taille du tas en utilisant: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
la source
Cela signifie que vous créez plus d'objets dans votre application sur une période de temps en continu. Les nouveaux objets seront stockés dans la mémoire du tas et c'est la raison de la croissance de la mémoire du tas.
Heap ne contient pas seulement des variables d'instance. Il stockera tous les types de données non primitifs (objets). La durée de vie de ces objets peut être courte (bloc de méthode) ou longue (jusqu'à ce que l'objet soit référencé dans votre application)
Oui. Jetez un œil à cet article sur l' oracle pour plus de détails.
Il existe deux paramètres pour définir la taille du tas:
-Xms:, qui définit la taille initiale et minimale du tas
-Xmx:, qui définit la taille maximale du tas
Cela dépend de votre application.
Définissez la mémoire maximale du tas selon les besoins de votre application
Ne provoquez pas de fuites de mémoire dans votre application
Si vous trouvez des fuites de mémoire dans votre application, trouvez la cause principale à l'aide d'outils de profilage comme MAT , Visual VM , jconsole, etc. Une fois que vous avez trouvé la cause principale, corrigez les fuites.
Notes importantes de l' article d' Oracle
Raisons possibles:
Sur une note différente, utilisez de meilleurs algorithmes de récupération de place ( CMS ou G1GC )
Jetez un œil à cette question pour comprendre G1GC
la source
Dans la plupart des cas, le code n'est pas optimisé. Libérez les objets dont vous pensez qu'ils ne seront plus nécessaires. Évitez à chaque fois de créer des objets dans votre boucle. Essayez d'utiliser des caches. Je ne sais pas comment va votre application. Mais dans la programmation, une règle de la vie normale s'applique également
Mieux vaut prévenir que guérir. "Ne créez pas d'objets inutiles"
la source
Les variables locales sont situées sur la pile. L'espace de tas est occupé par des objets.
Vous pouvez utiliser l'
-Xmx
option.Fondamentalement, l'espace du tas est utilisé chaque fois que vous allouez un nouvel objet avec
new
et libéré un certain temps après que l'objet n'est plus référencé. Assurez-vous donc de ne pas conserver les références aux objets dont vous n'avez plus besoin.la source
Non, je pense que vous pensez à l'espace de pile. L'espace de tas est occupé par des objets. Le moyen de l'augmenter est -Xmx256m, en remplaçant le 256 par le montant dont vous avez besoin sur la ligne de commande.
la source
Pour éviter cette exception, si vous utilisez JUnit et Spring, essayez d'ajouter ceci dans chaque classe de test:
la source
Dans netbeans, allez dans la barre d'outils 'Exécuter', -> 'Définir la configuration du projet' -> 'Personnaliser' -> 'exécuter' de sa fenêtre contextuelle -> 'Option VM' -> remplir '-Xms2048m -Xmx2048m '. Cela pourrait résoudre un problème de taille de tas.
la source