Java.lang.OutOfMemoryError: Espace de tas Java


Je reçois l'erreur suivante lors de 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 de tas n'est occupé que par des variables d'instance. Si cela est correct, alors pourquoi cette erreur s'est produite après l'exécution correcte pendant un certain temps car l'espace par exemple les variables sont attribués au moment de la création de l'objet.

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

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

Author: Ravindra babu, 2009-10-20

10 answers

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 de la machine virtuelle sur le site Web Java .

Cependant, je recommanderais de profiler votre application pour savoir pourquoi votre taille de tas est mangée. NetBeans a untrès bon profileur inclus avec lui. Je crois qu'il utilise le jvisualvm sous le capot. Avec un profileur, vous pouvez essayer de trouvez où de nombreux objets sont créés, quand les objets sont collectés, et plus encore.

 97
Author: Thomas Owens, 2016-05-21 12:18:12

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 de la machine virtuelle Java

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

Ie

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

Mais 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 est difficile à répondre. Dernièrement, vous pouvez profiler en utilisant JConsole pour essayer de savoir où va votre mémoire

 25
Author: OscarRyz, 2009-10-20 17:27:06

Vous voudrez peut-être regarder 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 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 voulez juste changer la partie qui a un problème, plutôt que dire juste,

Très bien! Je vais donner 1G de RAM à la JVM.

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

Pour déterminer où peut se trouver 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 voudrez peut-être l'examiner, mais vous devez faire la vérification pendant que votre test est toujours en cours d'exécution.

 8
Author: James Black, 2013-06-19 07:50:32

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

-Xmx256M
 6
Author: Adamski, 2013-06-19 07:47:07

Vous pouvez obtenir la taille de votre mémoire de tas via le programme ci-dessous.

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

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

 6
Author: user2663609, 2015-11-20 08:54:35
  1. 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. Éviter la création d'objets dans votre boucle à chaque fois. Essayez d'utiliser des caches. Je ne sais pas comment va votre candidature. Mais en programmation, une règle de vie normale s'applique aussi

    Mieux vaut prévenir que guérir. "Ne créez pas d'objets inutiles"

 5
Author: DKSRathore, 2009-10-22 17:28:39
  1. À ma connaissance, l'espace de tas n'est occupé que par des variables d'instance. Si cela est correct, alors pourquoi cette erreur s'est produite après l'exécution correcte pendant un certain temps car l'espace par exemple les variables sont attribués 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. Les nouveaux objets seront stockés dans la mémoire de tas et c'est la raison de la croissance de la mémoire de tas.

Le tas ne contient pas seulement les 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. Est-il un moyen d'augmenter l'espace de tas?

Oui. Jetez un oeil à cet article oracle pour plus de détails.

Il existe deux paramètres pour définir la taille du tas:

-Xms:, qui définit le rapport initial et le minimum du tas taille

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

  1. Quels changements dois-je apporter à mon programme afin qu'il prenne moins d'espace dans le tas?

Cela dépend de votre application.

  1. Définissez la mémoire de tas maximale selon les exigences de votre 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 première à l'aide de outils de profilage comme MAT, Machine VIRTUELLE visuelle , jconsole etc. Une fois que vous avez trouvé la cause première, corrigez les fuites.

Remarques Importantes à partir d'oracle article

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

Raisons Possibles:

  1. Configuration incorrecte (ne pas allouer suffisamment la mémoire)
  2. L'application contient involontairement des références à des objets et cela empêche les objets d'être collectés
  3. Applications qui font un usage excessif des finaliseurs. Si une classe a une méthode finalize, les objets de ce type n'ont pas leur espace récupéré au moment de la récupération de place. Si le thread finalizer ne peut pas suivre, avec la file d'attente de finalisation, alors le tas Java pourrait se remplir et ce type d'exception OutOfMemoryError serait levé.

Sur une note différente, utilisez de meilleurs algorithmes de récupération de place (CMS ou G1GC )

Jetez un oeil à cette question pour comprendre G1GC

 5
Author: Ravindra babu, 2017-05-23 12:26:17
  1. Les variables locales sont situées sur la pile. L'espace de tas est occupé par des objets.

  2. Vous pouvez utiliser le -Xmx option.

  3. Fondamentalement, l'espace tas est utilisé chaque fois que vous allouez 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 les références à des objets dont vous n'avez plus besoin.

 3
Author: sepp2k, 2009-10-20 17:09:29

Non, je pense que vous pensez à l'espace de pile. L'espace de 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
Author: Yishai, 2009-10-20 17:07:50

Dans netbeans, Allez dans la barre d'outils 'Exécuter',- > 'Définir la configuration du projet'- > 'Personnaliser' - > 'exécuter' de son windo apparu - > 'Option VM' - > remplir '- Xms2048m-Xmx2048m'. Il pourrait résoudre le problème de taille de tas.

 0
Author: Xiaogang, 2017-06-12 22:49:25