2010-06-06 5 views
3

J'essaye de programmer un créateur de mots croisés. en utilisant un fichier txt de dictionnaire donné et un fichier txt de modèle donné. L'idée de base est l'utilisation de l'algorithme DFS. le problème commence quand le fichier du dictionnaire est gros (environ 50000 mots). alors je recive le:Exception dans le fil "principal" java.lang.OutOfMemoryError, Comment trouver et résoudre?

Exception dans le thread « principal » java.lang.OutOfMemoryError: limite de frais généraux GC dépassé

je sais qu'il ya une partie de mon programme que la mémoire de déchets, mais je ne sais pas où c'est, comment le trouver et comment le résoudre

+0

"Comment trouver" est couvert par cette question connexe: http://stackoverflow.com/questions/2840421/whats-a-good-free-tool-for-investigating-unintentional-object-retention-in-java – meriton

Répondre

3

Est-ce que ça gaspille vraiment de la mémoire? Si vous chargez un dictionnaire assez volumineux, vous pouvez simplement augmenter les paramètres de la mémoire JVM (la JVM dispose d'une allocation de mémoire maximale - en fonction de votre plate-forme et configurable).

par exemple.

$ java -Xmx512m .... 

augmenterait l'allocation de mémoire maximale de la JVM à 512m.

Si vous pensez avoir une fuite de mémoire (le nettoyage de la mémoire ne fonctionne pas car les références ne sont pas libérées), un profileur tel que YourKit peut être utile. Notez que ce n'est pas gratuit, mais la version d'évaluation peut vous aider à résoudre votre problème.

+0

hey, j'ai déjà essayé d'augmenter la mémoire JVM .. Avez-vous peut-être un autre conseil? –

+0

Avez-vous essayé de le profiler? –

+0

désolé pour mon ignorance, qu'est-ce que le profilage? –

0

quelques temps, je l'ai vu des gens dans la boucle d'initialiser les variables comme

While(condition){ 

    String s="tttt"; 

} 

Cela devrait être évité car il gaspille beaucoup de mémoire.

+0

Cela ne gaspille pas nécessairement de la mémoire (et votre exemple ne le fait certainement pas, car les chaînes littérales sont regroupées). Cela peut même aider car la collecte des ordures des jeunes objets est moins chère que la collecte des objets anciens. – gustafc

+0

Merci beaucoup .. c'est quelque chose que je ne connaissais pas.Il fait vraiment ma journée. –

0

Ceci est un problème délicat. Je l'ai rencontré une ou deux fois, et l'augmentation de la taille du tas n'aide pas. Le résoudre avec les paramètres de VM - vous pouvez même vouloir diminuer la taille de tas (cela a fonctionné une fois pour moi). Vous pouvez également vouloir tester différents garbage collectors, j'ai eu du succès en utilisant le G1 collector.

Conseils généraux sur la façon d'éviter cette erreur est également difficile (ou alors il m'a semblé quand j'ai étudié cette question pour résoudre mes propres problèmes). High infant mortality est probablement bon, car les objets jeunes sont moins chers à collecter que les anciens.

0

grand dictionnaire ... mmm .. y a-t-il une exigence absolue de stocker cela directement dans la mémoire du jvm?

Un fainéant comme moi stockerait cela dans une base de données (en mémoire même peut-être? - hypersonique par exemple), transférer la responsabilité de chercher dans une liste à la base de données pendant que mon programme travaillait à créer symétrique noir et blanc combinaisons carrées :)

Juste une pensée cependant.

2

Pour résoudre ce problème (en os à base de linux) faire suivant

1) augmenter la mémoire (de sorte que ce problème ne viennent pas souvent) en configurant « domaine.xml » dans

/GlassFish/domaine/domain1/config

recherche

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2) tuer le processus GlassFish pour libérer le port sur lequel il a été en cours d'exécution (dans mon cas, il était 8686) terminal ouvert (en OS linux) et le type -

sudo netstat -npl | grep 8686

cela se traduira par quelque chose comme ..

tcp6 0 0 :::8686 :::* LISTEN 3452/java

prochaine utilisation

kill -9 3452 pour tuer ce processus (3452 dans ce cas)

Maintenant, essayez de démarrer glassfish, il devrait commencer.

Questions connexes