50 votes

Espace mémoire Java manquant de mémoire

Mon application consomme beaucoup de mémoire, car il est en cours d'exécution physique des simulations. Le problème, c'est que systématiquement, lors de la 51e simulation, java lèvera une erreur se produit habituellement en raison d'un segment de l'espace de mémoire (mon programme par la suite des milliers de simulations).

Est-il de toute façon je ne peut pas simplement augmenter le tas de l'espace, mais de modifier mon programme de sorte que la mémoire est effacé après chaque course pour que je puisse exécuter un nombre arbitraire de simulations?

Merci

-edit-

Merci les gars. S'avère le logiciel de simulation n'était pas de compensation de l'information après chaque course et j'ai eu ces pistes, le tout stocké dans une liste de tableaux.

38voto

Michael Hernandez Points 201

Il n'y a aucun moyen d'augmenter dynamiquement le tas par programme, car 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 à 1024

ou, vous pouvez définir un min max

 java -Xms256m -Xmx1024m YourClassNameHere
 

20voto

unkx80 Points 71

Si vous êtes en utilisant beaucoup de mémoire et face à des fuites de mémoire, alors vous pourriez vouloir vérifier si vous êtes en utilisant un grand nombre de ArrayLists ou HashMaps avec de nombreux éléments.

Un ArrayList est implémenté sous la forme d'un tableau dynamique. Le code source de Sun/Oracle montre que, lorsqu'un nouvel élément est inséré dans un plein ArrayList, un nouveau tableau de 1,5 fois la taille du tableau d'origine est créé, et les éléments copiés. Ce que cela signifie est que vous pouvez être en train de perdre jusqu'à 50% de l'espace dans chaque ArrayList vous utilisez, sauf si vous appelez sa trimToSize méthode. Ou mieux encore, si vous connaissez le nombre d'éléments que vous allez insérer avant de la main, puis d'appeler le constructeur avec la capacité initiale comme argument.

Je n'ai pas examiner le code source pour HashMap très attentivement, mais à première vue, il semble que la longueur du tableau dans chaque HashMap doit être une puissance de deux, ce qui une autre mise en œuvre d'un tableau dynamique. Notez que HashSet est essentiellement un wrapper autour de HashMap.

13voto

mezmo Points 1678

Il existe une variété d'outils que vous pouvez utiliser pour vous aider à diagnostiquer ce problème. Le JDK comprend JVisualVM qui vous permettra de l'attacher à un processus en cours d'exécution et de montrer ce que les objets pourraient être de plus en plus hors de contrôle. Netbeans est un wrapper autour de ce qui fonctionne assez bien. Eclipse Eclipse de la Mémoire de l'Analyseur, qui est celui que j'utilise le plus souvent, semble juste de traiter de gros fichiers de vidage un peu mieux. Il y a également une option de ligne de commande -XX:+HeapDumpOnOutOfMemoryError qui vous donnera un fichier qui est fondamentalement un instantané de votre processus de la mémoire lorsque votre programme s'est écrasé. Vous pouvez utiliser l'un des outils mentionnés ci-dessus pour la regarder, il peut vraiment aider beaucoup lorsque le diagnostic de ces sortes de problèmes.

En fonction de la difficulté du programme de travail, il peut être un cas simple de la JVM ne sachant pas quand un bon moment pour collecter les ordures peut-être, vous devriez également regarder dans le parallèle de la collecte des ordures et des options.

6voto

PSR Points 14768

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. Au lieu d'objectifs, donnez eclipse: eclipse install

-> Dans le deuxième onglet, donnez -Xmx1024m comme arguments VM.

4voto

P-H Points 167

Je voudrais ajouter que ce problème est similaire à la commune de la Java des fuites de mémoire.

Lorsque le garbage collector de la JVM est impossible d'effacer les "déchets" de la mémoire de votre Java / Java EE de l'application au fil du temps, OutOfMemoryError: Java heap space sera le résultat.

Il est important d'effectuer un bon diagnostic de la première:

  • Activer verbose:gc. Cela vous permettra de comprendre la mémoire se multiplier au fil du temps.
  • Générer et d'analyser un Dump du Tas de la JVM. Cela vous permettra de comprendre votre demande empreinte mémoire et identifier la source de la fuite de mémoire(s).
  • Vous pouvez également utiliser Java profileurs de l'exécution et de fuite de mémoire de l'analyseur comme Plumbr ainsi pour vous aider dans cette tâche.

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