La façon de traiter avec “java.lang.OutOfMemoryError: Java heap space” d'erreur?
Je suis en train d'écrire un côté client Swing application 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 de la version 5.0 de Java Virtual Machine et les autres disent sur la machine Windows, la JVM par défaut max taille de segment de mémoire comme 64MB
.
Compte tenu de cette situation, comment dois-je faire avec cette contrainte?
Je pourrais augmenter le max de la taille du segment à l'aide de ligne de commande option 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'a 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 comme automatique de la mémoire virtuelle, l'extension de la taille du segment de manière dynamique, qui sera grande.
- La valeur par défaut max taille du segment de mémoire de 64 MO est un avant J2SE 5.0. Pour J2SE 8.0 informations, voir "Garbage Collector "Ergonomie" dans le docs.oracle.com/javase/8/docs/technotes/guides/vm/... .
- Si vous avez atterri ici parce que chaque OOM question est dupe de celui-ci, assurez-vous de consulter aussi: stackoverflow.com/questions/299659/... Il fournit la solution pour le nettoyage de la mémoire des références "juste à temps" avant le OOM. SoftReferences peut être l'outil qui permet de résoudre votre problème.
Vous devez vous connecter pour publier un commentaire.
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
2GB
(pas spécifiquement tas mais la quantité totale de mémoire par processus). Il se trouve que Java choisit de 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 plus utilisez, ou de l'allocation de nombreux objets quand vous pourriez réutilisation eux à la place. 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.
Exécuter Java avec l'option de ligne de commande
-Xmx
, qui définit la maximum la taille du tas.Voir ici pour les détails.
Vous pouvez spécifier par projet de combien d'espace de segment de mémoire de votre projet veut
Qui suit est pour Eclipse Helios/Junon/Kepler:
Droit de la souris cliquez sur
puis ajouter ce
L'augmentation de la taille du tas n'est pas une "solution", il est un "plâtre", 100% temporaire. Il va se planter à nouveau dans un autre endroit. Pour éviter ces problèmes, écrire haute performance code.
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,
-Xmx1600m
(m est obligatoire, sinon elle conduira à une autre erreur "Trop petit segment de mémoire initiale") fonctionne.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.
VM arguments travaillé pour moi dans eclipse. Si vous utilisez eclipse version 3.4, procédez de la manière suivante
aller à
Run --> Run Configurations -->
puis sélectionnez le projet maven build --> sélectionnez ensuite l'onglet "JRE" --> entrez ensuite-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.
Oui, avec
-Xmx
vous pouvez configurer la mémoire de votre JVM.Pour être sûr que vous n'avez pas de fuite ou de la mémoire des déchets. Prendre un tas de vidage et de l'utilisation l'Éclipse de la Mémoire de l'Analyseur pour analyser votre consommation de mémoire.
Je voudrais ajouter des recommandations à partir d'oracle dépannage article.
Exception in thread thread_name: java.lang.OutOfMemoryError: Java heap space
Causes possibles:
Simple problème de configuration, où le segment de mémoire est insuffisante pour l'application.
Application est involontairement la tenue des références à des objets, et cela empêche les objets de ces ordures.
Utilisation Excessive des finaliseurs.
Après la collecte des ordures, les objets sont mis en file d'attente pour finalisation, qui survient à un moment ultérieur. finaliseurs sont exécutées par un fil de démon que les services de la file d'attente de finalisation. Si le finaliseur thread ne peut pas maintenir en place avec la file d'attente de finalisation, puis le tas Java pourrait remplir ce type de OutOfMemoryError exception sera levée.
Un scénario qui peut provoquer cette situation, c'est quand une application crée haute-threads de priorité qui causent la finalisation file d'attente à augmenter à un taux plus rapide que la vitesse à laquelle le finaliseur thread est de l'entretien que de la file d'attente.
Suivez les étapes ci-dessous:
Ouvrir
catalina.sh
de tomcat/bin.Changement JAVA_OPTS à
Redémarrer votre serveur tomcat
Moyen facile de résoudre
OutOfMemoryError
en java est d'augmenter la taille maximale du tas en utilisant des options JVM-Xmx512M
, ce sera immédiatement résoudre votre OutOfMemoryError. C'est ma solution préférée quand je reçois OutOfMemoryError dans Eclipse, Maven ou ANT tout projet de construction car il est basé sur la taille du projet, vous pouvez facilement manqué de Mémoire.Voici un exemple de l'augmentation de taille maximale du tas de la JVM, Également de son mieux pour garder -Xmx à -Xms ration de 1:1 ou de 1:1,5, si vous êtes réglage de la taille de segment de mémoire dans votre application java.
export JVM_ARGS="-Xms1024m -Xmx1024m"
Lien De Référence
Par défaut pour le développement de la JVM utilise la petite taille et de petite config pour d'autres liées à la performance de fonctionnalités. Mais pour la production, vous pouvez régler par exemple (En plus c'Application Server configuration spécifique peut exister) -> (Si il n'y a pas assez de mémoire pour satisfaire la demande et le tas a déjà atteint la taille maximale, un OutOfMemoryError aura lieu
Par exemple: Sur une Plateforme linux pour le mode de production préférable paramètres.
Après le téléchargement et la configuration de serveur avec cette façon http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/
1.créer setenv.sh fichier dans le dossier /opt/tomcat/bin/
2.Ouvrir et écrire ce params pour la mise préférable mode.
3.
service tomcat restart
Que j'ai rencontré le même problème à partir de java de la taille du segment.
J'ai deux solutions si vous êtes à l'aide de java 5(1.5).
il suffit d'installer jdk1.6 et allez dans les préférences d'eclipse et de définir le jre chemin de jav1 de 1,6 que vous avez installés.
Vérifier votre VM argument et le laisser être ce qu'il est.
juste ajouter une ligne en dessous de tous les arguments présents dans VM arguments
-Xms512m -Xmx512m -XX:MaxPermSize=...m(192m).
Je pense que cela fonctionnera...
J'ai lu quelque part ailleurs que vous pouvez try - catch java.lang.OutOfMemoryError et sur le bloc catch, vous pouvez libérer toutes les ressources que vous connaissez peut utiliser beaucoup de mémoire, à proximité des connexions et ainsi de suite, puis faire un
System.gc()
puis ré-essayez ce que vous alliez faire.Une autre façon est-ce bien que, je ne sais pas si ça allait fonctionner, mais je suis en train de tester si elle fonctionne sur mon application.
L'Idée est de faire la collecte des Ordures par le Système d'appel.gc() qui est connu pour augmenter la quantité de mémoire libre. Vous pouvez garder le contrôle de ce après un mémoire avalant le code s'exécute.
Si vous avez besoin de surveiller votre utilisation de la mémoire lors de l'exécution, la
java.lang.management
offreMBeans
qui peut être utilisé pour surveiller les pools de mémoire de votre machine virtuelle (par exemple, l'eden de l'espace, maître de génération, etc), et aussi la collecte des ordures comportement.L'espace de segment de mémoire rapportés par ces MBeans varient considérablement en fonction de GC comportement, en particulier si votre application génère beaucoup d'objets qui sont plus tard GC-ed. Une approche possible consiste à surveiller l'espace de segment de mémoire après chaque plein GC, que vous pouvez être en mesure d'utiliser pour prendre une décision sur la manière de libérer de la mémoire par la persistance des objets.
En fin de compte, votre meilleur pari est de limiter votre rétention de la mémoire autant que possible, tandis que la performance reste acceptable. Comme un commentaire précédent a noté, la mémoire est toujours limitée, mais votre application doit avoir une stratégie pour faire face à l'épuisement de la mémoire.
Notez que si vous avez besoin de cette dans un déploiement de la situation, envisager l'utilisation de Java WebStart (avec un "ondisk" version, pas le réseau d'un possible en Java 6u10 et plus tard), car il vous permet de spécifier les différents arguments de la JVM dans une plate-forme de façon.
Sinon, vous aurez besoin d'un système d'exploitation spécifique lanceur qui définit les arguments dont vous avez besoin.
Si ce problème se passe dans Wildfly 8 et JDK1.8,alors nous avons besoin de spécifier MaxMetaSpace paramètres au lieu de PermGen paramètres.
Par exemple, nous avons besoin d'ajouter dans la configuration ci-dessous setenv.sh fichier de wildfly.
JAVA_OPTS="$JAVA_OPTS -XX:MaxMetaspaceSize=256M"
Pour plus d'informations, veuillez consulter Wildfly Tas De Question
Concernant netbeans, vous pouvez configurer le max de la taille du segment de résoudre le problème.
Allez dans "Exécuter", puis --> 'Ensemble du Projet de Configuration' --> 'Personnaliser' --> " run " de sa fenêtre surgi --> 'VM Option' --> remplir '-Xms2048m -Xmx2048m'.
Si vous garder sur l'allocation de & conserver les références à l'objet, vous devrez remplir toute quantité de mémoire dont vous disposez.
Une option est de faire un fichier transparent fermer & ouvrir quand ils changer d'onglet (que vous gardez un pointeur vers le fichier, et lorsque l'utilisateur passe de l'onglet, vous fermez & nettoyer tous les objets... il va faire le changement de fichier plus lent... mais...), et peut-être de ne garder que 3 ou 4 fichiers sur la mémoire.
Autre chose que vous devriez faire, c'est que lorsque l'utilisateur ouvre un fichier, charger, et intercepter tout OutOfMemoryError, puis (comme il n'est pas possible d'ouvrir le fichier) fermer le fichier, nettoyer ses objets et d'avertir l'utilisateur qu'il doit fermer les fichiers inutilisés.
Votre idée de manière dynamique, de l'extension de la mémoire virtuelle ne résout pas le problème, la machine est limitée sur les ressources, de sorte que vous devez être prudent & traiter les problèmes de mémoire (ou au moins, être prudent avec eux).
Une couple de trucs que j'ai vu avec des fuites de mémoire est:
--> Gardez à l'esprit que si vous mettez quelque chose dans une collection et ensuite l'oublier, vous avez toujours une référence forte, de sorte à annuler les avantages de la collecte, de le nettoyer ou de faire quelque chose avec elle... si pas, vous trouverez une fuite de mémoire difficile à trouver.
--> Peut-être, à l'aide de collections avec des références faibles (weakhashmap...) peut aider avec des problèmes de mémoire, mais vous doit être prudent avec elle, vous trouverez peut-être que l'objet que vous recherchez a été recueilli.
--> une Autre idée que j'ai trouvé est de développer une persistance de la collection stockées sur des objets de base de données les moins utilisées de manière transparente et chargé. Ce serait probablement la meilleure approche...