Espace de mémoire Java hors mémoire

Mon application consum actuellement beaucoup de mémoire car elle exécute des simulations physiques. Le problème est que, lors de la 51ème simulation, Java jettera une erreur en raison d’un espace mémoire insuffisant (mon programme exécute à terme des milliers de simulations).

Y a-t-il de toute façon je ne peux pas simplement augmenter l’espace de tas mais modifie mon programme pour que l’espace de tas soit effacé après chaque exécution afin que je puisse exécuter un nombre arbitraire de simulations?

Merci

-modifier-

Merci les gars. Il s’avère que le logiciel de simulation n’a pas effacé l’information après chaque exécution et que toutes ces parsings étaient stockées dans une arraylist.

Il n’y a aucun moyen d’augmenter dynamicment le tas de manière systématique puisque le tas est alloué au démarrage de la machine virtuelle Java.

Cependant, vous pouvez utiliser cette commande

java -Xmx1024M YourClass 

définir la mémoire sur 1024

ou, vous pouvez définir un min max

 java -Xms256m -Xmx1024m YourClassNameHere 

Si vous utilisez beaucoup de mémoire et que vous faites face à des memory leaks, vous pouvez vérifier si vous utilisez un grand nombre de ArrayList ou HashMap avec de nombreux éléments.

Un ArrayList est implémenté en tant que tableau dynamic . Le code source de Sun / Oracle montre que lorsqu’un nouvel élément est inséré dans une ArrayList complète, un nouveau tableau de 1,5 fois la taille du tableau d’origine est créé et les éléments sont copiés. Cela signifie que vous pouvez gaspiller jusqu’à 50% de l’espace dans chaque ArrayList vous utilisez, à moins que vous sortingmToSize sa méthode sortingmToSize . Ou mieux encore, si vous connaissez le nombre d’éléments à insérer avant l’appel, appelez le constructeur avec la capacité initiale en argument.

Je n’ai pas examiné le code source de HashMap très attentivement, mais à première vue, il semble que la longueur du tableau dans chaque HashMap soit de deux, ce qui en fait une autre implémentation d’un tableau dynamic. Notez que HashSet est essentiellement un wrapper autour de HashMap .

Vous pouvez utiliser différents outils pour diagnostiquer ce problème. Le JDK inclut JVisualVM qui vous permet de vous connecter à votre processus en cours d’exécution et d’afficher les objects susceptibles de devenir hors de contrôle. Netbeans a une enveloppe qui fonctionne assez bien. Eclipse a l’parsingur de mémoire Eclipse qui est celui que j’utilise le plus souvent, semble juste gérer les fichiers de vidage volumineux un peu mieux. Il existe également une option de ligne de commande, -XX: + HeapDumpOnOutOfMemoryError, qui vous donnera un fichier qui est essentiellement un instantané de votre mémoire de processus lorsque votre programme est tombé en panne. Vous pouvez utiliser n’importe lequel des outils mentionnés ci-dessus pour l’examiner, cela peut vraiment aider beaucoup lors du diagnostic de ce type de problèmes.

En fonction de la difficulté du programme, il peut être simple que la JVM ne sache pas à quel moment il est possible de collecter les ordures, vous pouvez également examiner les options de récupération de place parallèles.

J’ai également fait face au même problème.J’ai résolu en faisant la construction en suivant les étapes comme.

-> Faites un clic droit sur le projet sélectionnez RunAs -> Exécuter les configurations

Sélectionnez votre projet en tant que BaseDirectory. À la place des objectives, éclipse: eclipse install

-> Dans le deuxième onglet, donnez -Xmx1024m comme arguments de machine virtuelle.

Je voudrais append que ce problème est similaire aux memory leaks Java courantes.

Lorsque le ramasse-miettes JVM ne parvient pas à effacer la mémoire ” gaspillée ” de votre application Java / Java EE au fil du temps, il en résultera un espace de tas OutOfMemoryError: Java .

Il est important d’effectuer d’abord un diagnostic approprié:

  • Activer verbose: gc . Cela vous permettra de comprendre la structure croissante de la mémoire au fil du temps.
  • Générer et parsingr un vidage de tas JVM . Cela vous permettra de comprendre l’empreinte mémoire de votre application et de déterminer la source de la ou des memory leaks.
  • Vous pouvez également utiliser des profileurs Java et un parsingur de fuite de mémoire d’exécution tels que Plumbr pour vous aider dans cette tâche.

Essayez d’append -Xmx pour plus de mémoire ( java -Xmx1024M YourClass ), et n’oubliez pas de ne plus référencer les variables dont vous n’avez plus besoin (memory leaks).

Conservez-vous des références aux variables dont vous n’avez plus besoin (par exemple, les données des simulations précédentes)? Si oui, vous avez une fuite de mémoire. Il vous suffit de trouver où cela se produit et de vous assurer de supprimer les références aux variables quand elles ne sont plus nécessaires (cela se produira automatiquement si elles sont hors de scope).

Si vous avez réellement besoin de toutes ces données des simulations précédentes en mémoire, vous devez augmenter la taille du tas ou modifier votre algorithme.

Java est supposé effacer l’espace mémoire lorsque tous les objects ne sont plus référencés. En général, il ne le restituera pas à l’OS, il conservera cette mémoire pour sa propre réutilisation interne. Peut-être vérifier si vous avez des tableaux qui ne sont pas effacés ou quelque chose.

Non, le tas est effacé par le ramasse-miettes chaque fois qu’il en a envie. Vous pouvez lui demander de s’exécuter (avec System.gc() ) mais l’exécution n’est pas garantie.

Essayez d’abord d’augmenter la mémoire en réglant -Xmx256m