Java >> Tutoriel Java >  >> Java

Limite de frais généraux Java GC dépassée - Solution personnalisée nécessaire

J'évalue différentes données d'un fichier texte dans un algorithme assez volumineux.

Si le fichier texte contient plus de points de données (le minimum dont j'ai besoin est de quelque chose comme 1,3 million de points de données), il donne l'erreur suivante :

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
   at java.util.regex.Matcher.<init>(Unknown Source)
   at java.util.regex.Pattern.matcher(Unknown Source)
   at java.lang.String.replaceAll(Unknown Source)
   at java.util.Scanner.processFloatToken(Unknown Source)
   at java.util.Scanner.nextDouble(Unknown Source)

Lorsque je l'exécute dans Eclipse avec les paramètres suivants pour le jre6 installé (VM standard) :

-Xms20m -Xmx1024m -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:NewSize=10m 
-XX:MaxNewSize=10m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=80 
-XX:+CMSClassUnloadingEnabled

Notez que cela fonctionne bien si je ne parcours qu'une partie du fichier texte.

Maintenant, j'ai beaucoup lu sur ce sujet et il semble que quelque part je dois avoir soit une fuite de données, soit je stocke trop de données dans des tableaux (ce que je pense que je fais).

Maintenant, mon problème est :comment puis-je contourner ce problème ? Est-il possible de modifier mes paramètres de sorte que je puisse toujours effectuer le calcul ou ai-je vraiment besoin de plus de puissance de calcul ?

Répondre

L'argument vm vraiment critique est -Xmx1024m , qui indique à la machine virtuelle d'utiliser jusqu'à 1024 mégaoctets de mémoire. La solution la plus simple consiste à utiliser un nombre plus grand ici. Vous pouvez essayer -Xmx2048m ou -Xmx4096m , ou n'importe quel nombre, en supposant que vous disposez de suffisamment de RAM dans votre machine pour le gérer.

Je ne suis pas sûr que vous tiriez beaucoup d'avantages de l'un des autres arguments de VM. Pour la plupart, si vous indiquez à Java la quantité d'espace à utiliser, ce sera intelligent avec le reste des paramètres. Je suggérerais de tout supprimer sauf le -Xmx param et voir comment cela fonctionne.

Une meilleure solution consiste à essayer d'améliorer votre algorithme, mais je ne l'ai pas encore lu suffisamment en détail pour proposer des suggestions.


Balise Java