Question

Je reçois l'erreur suivante lors de l'exécution d'un programme multi-threading

java.lang.OutOfMemoryError: Java heap space

L'erreur précédente est survenue dans l'un des threads.

  1. Upto ma connaissance, l'espace Heap est occupé par exemple que des variables. Si cela est vrai, alors pourquoi cette erreur est survenue après l'exécution pendant un certain temps bien que l'espace pour les variables d'instance, sont affectées au moment de la création d'objets.

  2. Y at-il moyen d'augmenter l'espace de tas?

  3. Quels changements dois-je fait à mon programme afin qu'il saisira moins d'espace tas?

Était-ce utile?

La solution

Si vous voulez 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 trouver plus sur les options VM sur le site Web de Java .

Cependant, je recommande profiler votre application pour savoir pourquoi votre taille de tas est mangé. NetBeans a très bon profileur inclus avec elle. 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, lorsque des objets se ramasse-miettes, et plus encore.

Autres conseils

Oui 1.-, mais à peu près fait référence à toute la mémoire utilisée par votre programme.

voir les options Oui 2.- Java VM

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

Ie

java -Xmx2g attribuer 2 Go de RAM maximum votre application

Mais vous devriez voir si vous ne disposez pas d'une fuite de mémoire d'abord.

3.- Il dépend du programme. Essayez les fuites de mémoire place. Cette question serait difficile de répondre. vous pouvez Lately profil à l'aide JConsole pour essayer de savoir où votre mémoire va

Vous pouvez consulter ce site pour en savoir plus sur la mémoire dans la machine virtuelle Java: http://developer.streamezzo.com/content/learn/articles / optimisation mémoire tas utilisation

Je l'ai trouvé utile d'utiliser visualgc pour voir comment la différentes parties du modèle de mémoire se remplit, 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, comme vous voudrez peut-être changer seulement la partie qui a un problème, plutôt que de dire simplement,

  

Très bien! Je donnerai 1G de RAM à la machine virtuelle Java.

Essayez d'être plus précis sur ce que vous faites, à long terme, vous trouverez sans doute mieux le programme pour elle.

Pour déterminer où la fuite de mémoire peut être vous pouvez utiliser des tests unitaires pour que, en testant ce qui était la mémoire avant le test, et après, et s'il y a un trop grand changement alors vous voudrez peut l'examiner, mais, vous devez faire le contrôle pendant que votre test est toujours en cours.

Pour augmenter la taille du tas, vous pouvez utiliser l'argument -Xmx lors du démarrage de Java; par exemple.

-Xmx256M

Vous pouvez obtenir votre taille de la mémoire du tas par programe ci-dessous.

public class GetHeapSize {
    public static void main(String[] args) {
        long heapsize = Runtime.getRuntime().totalMemory();
        System.out.println("heapsize is :: " + heapsize);
    }
} 

vous pouvez donc augmenter la taille du tas en utilisant également: java -Xmx2g http://www.oracle.com/technetwork/java /javase/tech/vmoptions-jsp-140102.html

  
      
  1. Upto ma connaissance, l'espace Heap est occupé par exemple que des variables. Si cela est vrai, alors pourquoi cette erreur est survenue après l'exécution pendant un certain temps bien que l'espace pour les variables d'instance, sont affectées au moment de la création d'objets.
  2.   

Cela signifie que vous créez plusieurs objets dans votre application sur une période de temps continue. De nouveaux objets seront stockés dans la mémoire du tas et c'est la raison de la croissance en mémoire tas.

Heap contient non seulement les variables d'instance. Il enregistre tous les types de données non-primitives (objets). Ces temps de vie des objets peut être court (bloc de méthode) ou longue (jusqu'à ce que l'objet est référencé dans votre application)

  
      
  1. Est-il possible d'augmenter l'espace de tas?
  2.   

Oui. Jetez un coup d'œil à cet oracle plus de détails.

Il y a deux paramètres pour régler la taille du tas:

-Xms: , qui définit la taille de tas initiale et minimale

-Xmx: , qui définit la taille maximale du tas

  
      
  1. Quels changements dois-je fait à mon programme afin qu'il saisira moins d'espace tas?
  2.   

Cela dépend de votre application.

  1. Régler la mémoire de tas maximale selon vos besoins d'application

  2. Ne pas provoquer des fuites de mémoire dans votre application

  3. Si vous trouvez des fuites de mémoire dans votre application, trouver la cause racine avec l'aide d'outils de profilage comme MAT , visuel VM, jconsole etc. Une fois que vous trouvez la cause racine, fixer les fuites.

Notes importantes de l'oracle

  

Cause: Le message de détail Java espace de tas indique objet ne peut pas être attribué dans le tas Java. Cette erreur ne signifie pas nécessairement une fuite de mémoire.

Les raisons possibles:

  1. Une mauvaise configuration (pas allouer de la mémoire sufficiant)
  2. Application tient involontairement des références à des objets, ce qui empêche les objets d'être garbage collection
  3. Les applications qui font un usage excessif de finaliseurs. Si une classe a une méthode finale, les objets de ce type n'ont pas leur espace récupéré au moment de la collecte des ordures. Si le thread finaliseur ne peut pas suivre, avec la file d'attente de finalisation, le tas Java pourrait remplir ce type d'exception OutOfMemoryError seraient jetés .

Dans un autre, une meilleure utilisation des algorithmes de collecte des ordures ( CMS ou G1GC )

Jetez un oeil à cette question pour comprendre G1GC

  1. Dans la plupart des cas, le code est pas optimisé. Relâche ces objets que vous pensez ne doit pas être nécessaire plus loin. Éviter la création d'objets dans votre boucle à chaque fois. Essayez d'utiliser des caches. Je ne sais pas comment faire votre demande. Mais dans la programmation, une règle de vie normale s'applique également

    Mieux vaut prévenir que guérir. "Ne pas créer des objets inutiles"

  1. Les variables locales sont situées sur la pile. espace Heap est occupé par des objets.

  2. Vous pouvez utiliser l'option -Xmx.

  3. En gros tas d'espace est épuisé chaque fois que vous allouez un nouvel objet avec new et libéré peu de temps après que l'objet ne soit plus référencé. Donc, assurez-vous que vous ne gardez pas de références à des objets que vous ne avez plus besoin.

Non, je pense que vous pensez de l'espace de la pile. l'espace Heap est occupé par des objets. La façon d'augmenter, il est -Xmx256m, en remplaçant le 256 avec le montant dont vous avez besoin sur la ligne de commande.

Dans NetBeans, allez à la barre d'outils 'Run', -> 'Définir la configuration du projet' -> 'Personnaliser' -> 'run' de son sauté vers le haut Windo -> 'VM Option' -> remplir '-Xms2048m -Xmx2048m'. Il pourrait résoudre le problème de la taille du tas.

Pour éviter cette exception, si vous utilisez JUnit et essayer Spring ajouter ceci dans toutes les classes de test:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top