497 votes

La façon de traiter avec "java.lang.OutOfMemoryError: Java heap space" erreur (64 MO taille de segment de mémoire)

Je suis en train d'écrire un côté client application Swing (graphique concepteur de la police) sur Java 5. Récemment, je suis en cours d'exécution dans "java.lang.OutOfMemoryError: Java heap space" erreur parce que je ne suis pas d'être prudente sur l'utilisation de la mémoire. L'utilisateur peut ouvrir un nombre illimité de fichiers, et le programme garde le ouvert les objets dans la mémoire. Après une rapide recherche, j'ai trouvé l'Ergonomie dans la version 5.0 de la Machine Virtuelle Java et les autres disent sur la machine Windows, la JVM par défaut max taille de segment de mémoire que de 64 mo.

Compte tenu de cette situation, comment dois-je faire avec cette contrainte?

Je pourrais augmenter le max de segment de taille en utilisant l'option de ligne de commande pour java, mais cela nécessiterait de déterminer la quantité de RAM disponible et l'écriture de lancement du programme ou d'un script. En outre, l'augmentation de certains finis max n'est pas en fin de compte se débarrasser de la question.

Je pourrais réécrire certains de mon code pour conserver les objets de système de fichiers fréquemment (à l'aide de la base de données est la même chose) pour libérer de la mémoire. Il pourrait fonctionner, mais il est sans doute beaucoup trop de travail.

Si vous pouviez m'indiquer les détails de ci-dessus des idées ou des solutions de rechange telles que le réglage automatique de la mémoire virtuelle, l'extension de la taille du segment de manière dynamique, qui sera grande.

281voto

Ben Childs Points 1831

En fin de compte, vous avez toujours une durée max de tas d'utiliser n'importe quelle plate-forme vous sont en cours d'exécution sur. Dans Windows 32 bits c'est autour de 2 go de ram (pas spécifiquement tas mais la quantité totale de mémoire par processus). Il se trouve que Java arrive à rendre la valeur par défaut de taille (sans doute pour que le programmeur ne peut pas créer des programmes qui ont un emballement de l'allocation de la mémoire sans se heurter à ce problème et d'avoir à examiner exactement ce qu'ils font).

Donc, cela étant donné, il existe plusieurs approches que vous pouvez prendre soit de déterminer la quantité de mémoire dont vous avez besoin, ou pour réduire la quantité de mémoire que vous utilisez. Une erreur commune avec les ordures ménagères collectées à des langages comme Java ou C# est de garder autour de références à des objets que vous n'êtes plus à l'aide, ou de l'allocation de nombreux objets lorsque vous pouvez les réutiliser au lieu de cela. Aussi longtemps que les objets ont une référence pour eux, ils vont continuer à utiliser de la mémoire que le garbage collector ne sera pas de les supprimer.

Dans ce cas, vous pouvez utiliser une mémoire Java profiler pour déterminer quelles sont les méthodes dans votre programme sont l'allocation grand nombre d'objets et de déterminer ensuite si il y a un moyen pour s'assurer qu'ils ne sont plus référencés, ou de ne pas les affecter en premier lieu. Une option que j'ai utilisé dans le passé est "JMP" http://www.khelekore.org/jmp/.

Si vous déterminez que vous êtes de la répartition de ces objets pour une raison et vous avez besoin de garder autour de références (en fonction de ce que vous faites, cela peut être le cas), vous aurez seulement besoin d'augmenter le max de la taille du segment lorsque vous démarrez le programme. Cependant, une fois que vous faites le profilage de la mémoire et de comprendre comment les objets deviennent alloué, vous devriez avoir une meilleure idée de la quantité de mémoire dont vous avez besoin.

En général, si vous ne pouvez pas garantir que votre programme s'exécute en une certaine quantité de mémoire (peut-être en fonction de la taille de l'image), vous courez toujours ce problème. Seulement après avoir épuisé tous ce dont vous aurez besoin pour examiner la mise en cache des objets sur le disque, etc. À ce stade, vous devriez avoir une très bonne raison de dire "j'ai besoin de Xgb de la mémoire" pour quelque chose et vous ne pouvez pas le contourner par l'amélioration de votre algorithmes ou d'allocation de mémoire de modèles. Généralement, cela ne sera généralement le cas pour les algorithmes d'exploitation sur de grands ensembles de données (comme une base de données ou de certains scientifiques du programme d'analyse), puis des techniques comme la mise en cache et de la mémoire mappée IO devenir utile.

142voto

Dave Webb Points 90034

Exécuter Java avec l'option de ligne de commande -Xmx, qui fixe le maximum de la taille du tas.

Voir ici pour plus de détails..

97voto

allenhwkim Points 6012

Vous pouvez spécifier par projet combien la mémoire de votre projet veut

La suite est pour Eclipse Helios/Junon/Kepler:

Clic droit de la souris - Exécuter en tant Qu' - Configuration d'essai - Arguments - Vm Arguments, puis ajouter ce -Xmx2048m

31voto

David Points 1241

Grosse mise en garde ---- à mon bureau, nous avons été de trouver que (sur certaines machines windows) on ne peut pas allouer plus de 512 mo pour Java heap. Ceci s'est avéré être en raison de Kaspersky anti-virus installé sur certaines de ces machines. Après la désinstallation qui produit AV, nous avons constaté que nous pourrions consacrer au moins 1,6 go, j'.e-Xmx1600 œuvres.

Aucune idée si cela se produit avec d'autres produits AV mais vraisemblablement ce qui se passe parce que le programme AV est de réserver un petit bloc de mémoire dans chaque espace d'adressage, ce qui empêche le seul vraiment beaucoup.

24voto

loveall Points 61

VM arguement a travaillé pour moi dans eclipse. Si vous utilisez eclipse version 3.4, procédez de la manière suivante

aller à l' Run --> Run Configurations --> puis sélectionnez le projet maven build --> puis sélectionnez l'onglet "JRE" --> puis entrez -Xmx1024m.

Vous pouvez également faire Run --> Run Configurations --> select the "JRE" tab --> puis entrez -Xmx1024m

Cela devrait augmenter la mémoire du tas pour tous les builds/projets. Au-dessus de la taille de la mémoire est de 1 GO. Vous pouvez optimiser la façon dont vous le souhaitez

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