Java.lang.OutOfMemoryError: Java heap space

j'obtiens l'erreur suivante sur l'exécution d'un programme multi-threading

java.lang.OutOfMemoryError: Java heap space

L'erreur ci-dessus s'est produite dans l'un des threads.

  1. à ma connaissance, L'espace en tas n'est occupé que par les variables d'instance. Si ceci est correct, alors pourquoi cette erreur s'est produite après avoir exécuté fine pendant un certain temps comme l'espace par exemple les variables sont alloties au moment de la création de l'objet.

  2. Est-il un moyen d'augmenter l'espace de tas?

  3. quelles modifications dois-je apporter à mon programme pour qu'il prenne moins d'espace?

90
demandé sur Ravindra babu 2009-10-20 21:02:55

10 réponses

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 en savoir plus sur les options VM sur le site Web Java .

cependant, je recommande d'établir le profil de votre application pour savoir pourquoi votre taille de tas est mangée. NetBeans a un 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, quand les objets sont ramassés, et plus encore.

97
répondu Thomas Owens 2016-05-21 12:18:12

1.- Oui, mais ça fait référence à toute la mémoire utilisée par votre programme.

2.- Oui voir Java VM options

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

Ie

java -Xmx2g assignez 2 gigaoctets de ram au maximum à votre application

mais vous devriez voir si vous n'avez pas une fuite de mémoire d'abord.

3.- Cela dépend du programme. Essayez les fuites de mémoire. Cette question est difficile à répondre. Dernièrement, vous pouvez profiler en utilisant JConsole pour essayer de savoir où votre mémoire va à

25
répondu OscarRyz 2009-10-20 17:27:06

vous pouvez consulter ce site pour en savoir plus sur la mémoire dans le JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage

j'ai trouvé utile d'utiliser visualgc pour regarder 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é rempli, donc visualgc, comme vous pouvez simplement changer la partie qui a un problème, plutôt que de simplement dire

très bien! Je donnerai 1 g de RAM au JVM.

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

pour déterminer où la fuite de mémoire peut être vous pouvez utiliser des tests unitaires pour cela, en testant quelle était la mémoire avant l'essai, et après, et si Il ya un trop grand changement que vous pouvez vouloir examiner, mais, vous devez faire la vérification pendant que votre test est encore en cours d'exécution.

8
répondu James Black 2013-06-19 07:50:32

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

-Xmx256M
6
répondu Adamski 2013-06-19 07:47:07

vous pouvez obtenir votre taille de mémoire tas par le programme ci-dessous.

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

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

6
répondu user2663609 2015-11-20 08:54:35
  1. Dans la plupart des cas, le code n'est pas optimisé. Libérez les objets qui, selon vous, ne seront plus nécessaires. Éviter la création d'objets dans votre boucle à chaque fois. Essayez d'utiliser des caches. Je ne sais pas comment se porte votre candidature. Mais Dans la programmation, une règle de vie normale s'applique aussi bien

    mieux vaut prévenir que guérir. "Ne pas créer inutilement des objets"

5
répondu DKSRathore 2009-10-22 17:28:39
  1. à ma connaissance, L'espace en tas n'est occupé que par les variables d'instance. Si ceci est correct, alors pourquoi cette erreur s'est produite après avoir exécuté fine pendant un certain temps comme l'espace par exemple les variables sont alloties au moment de la création de l'objet.

cela signifie que vous créez plus d'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 pour la croissance dans 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)

  1. y a-t-il un moyen d'augmenter l'espace en tas?

Oui. Regardez cet oracle article pour plus de détails.

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

-Xms: , qui fixe la taille initiale et minimale du tas

-Xmx: , qui fixe la taille maximale du tas

  1. quelles modifications dois-je apporter à mon programme pour qu'il prenne moins d'espace?

cela dépend de votre application.

  1. Réglez la mémoire de tas maximale selon votre exigence 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, trouvez la cause profonde à l'aide d'outils de profilage comme MAT , Visual VM , jconsole etc. Une fois que vous avez trouvé la cause, réparez les fuites.

remarques Importantes à partir d'oracle article

Cause: le message de détail Java heap space indique que l'objet ne pouvait pas être alloué dans le tas Java. Cette erreur n'implique pas nécessairement une fuite de mémoire.

raisons possibles:

  1. Mauvaise configuration ( n'affectant pas suffisantes mémoire)
  2. Application est involontairement la tenue des références à des objets et cela empêche les objets nettoyés
  3. des Applications qui font usage excessif de la finaliseurs. Si une classe a une méthode de finition, alors les objets de ce type n'ont pas leur espace récupéré au moment de la collecte des ordures. si le fil finalizer ne peut pas suivre, avec la file d'attente de finalisation, puis le tas de Java pourrait remplir et ce type d'exception OutOfMemoryError serait jeté .

Sur une note différente, utiliser au mieux la collecte des Ordures algorithmes ( CMS ou G1GC )

Avoir un oeil à cette question pour la compréhension de G1GC

5
répondu Ravindra babu 2017-05-23 12:26:17
  1. les variables locales se trouvent sur la pile. L'espace en tas est occupé par des objets.

  2. vous pouvez utiliser l'option -Xmx .

  3. fondamentalement l'espace de tas est utilisé chaque fois que vous attribuez un nouvel objet avec new et libéré quelque temps après que l'objet n'est plus référencé. Assurez-vous donc de ne pas conserver de références à des objets dont vous n'avez plus besoin.

3
répondu sepp2k 2009-10-20 17:09:29

Non, Je pense que vous pensez à stack space. L'espace en tas est occupé par des objets. La façon de l'augmenter est-Xmx256m, en remplaçant le 256 par le montant dont vous avez besoin sur la ligne de commande.

1
répondu Yishai 2009-10-20 17:07:50

Dans netbeans, Allez dans "Exécuter" de la barre d'outils, --> 'Projet de Configuration' --> 'Personnaliser' --> 'exécuter' de ses surgi windo --> 'VM Option' --> remplir '-Xms2048m -Xmx2048m'. Ça pourrait résoudre le problème de la taille du tas.

0
répondu Xiaogang 2017-06-12 22:49:25