102 votes

java.lang.OutOfMemoryError : Espace de tas de Java

J'obtiens l'erreur suivante lors de l'exécution d'un programme multithreading

java.lang.OutOfMemoryError: Java heap space

L'erreur ci-dessus s'est produite dans l'un des fils de discussion.

  1. A ma connaissance, l'espace du tas est occupé par les variables d'instance uniquement. Si cela est correct, alors pourquoi cette erreur s'est produite après avoir fonctionné correctement pendant un certain temps, car l'espace pour les variables d'instance est alloué au moment de la création de l'objet.

  2. Existe-t-il un moyen d'augmenter l'espace du tas ?

  3. Quelles modifications dois-je apporter à mon programme pour qu'il occupe moins d'espace dans le tas ?

5 votes

108voto

Thomas Owens Points 45042

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 de JRE et la configuration du système. Vous pouvez connaître Pour en savoir plus sur les options de la VM, consultez le site Web de Java .

Cependant, je vous recommande d'établir le profil de votre application pour savoir pourquoi la taille de votre tas est consommée. NetBeans dispose d'une fonction 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 ramassés, et plus encore.

1 votes

J'utilise Netbeans mais je ne sais pas comment utiliser le profileur. J'aimerais en savoir plus sur le profileur afin de pouvoir l'utiliser pour trouver les fuites de mémoire dans mon application.

0 votes

J'ai ajouté un lien vers une page du site NetBeans ( profiler.netbeans.org ) qui contient une très bonne documentation sur le profil, depuis les bases jusqu'à une utilisation plus avancée.

0 votes

Les valeurs par défaut changent avec les versions de java, il serait bien d'inclure cette information dans votre réponse.

30voto

OscarRyz Points 82553

Oui, mais cela fait référence à la totalité de la mémoire utilisée par votre programme.

2.- Oui, voir les options de Java VM

-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 d'abord vérifier si vous n'avez pas une fuite de mémoire.

3 - Cela dépend du programme. Essayez de repérer les fuites de mémoire. Il serait trop difficile de répondre à cette question. Dernièrement, vous pouvez utiliser JConsole pour essayer de trouver où va votre mémoire.

8voto

James Black Points 26183

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, afin de déterminer ce qu'il faut changer.

Il est difficile de déterminer quelle partie de la mémoire a été remplie, d'où le visualgc, car vous pouvez vouloir changer la partie qui a un problème, plutôt que de dire simplement,

Bien ! Je vais donner 1G de RAM à la JVM.

Essayez d'être plus précis dans 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, en testant la mémoire avant et après le test, et si le changement est trop important, vous pouvez l'examiner, mais vous devez faire la vérification pendant que votre test est toujours en cours.

6voto

Adamski Points 29884

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

-Xmx256M

5voto

DKSRathore Points 981
  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. Évitez de créer des objets dans votre boucle à chaque fois. Essayez d'utiliser les caches. Je ne sais pas comment se porte votre application. Mais en 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"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X