8
votes

Le programme Java se termine de manière inattendue sans message d'erreur

J'ai écrit un programme Java qui doit traiter des milliers de fichiers texte (tous doivent être chargés à la mémoire). Cela fonctionne bien avec jusqu'à 123 fichiers d'entrée, mais lorsque je l'exécute pour traiter environ 5000 fichiers, il se termine de manière inattendue au milieu de la route, sans donner de message d'erreur / exception. Quelqu'un peut-il me donner d'indifférence sur ce qui aurait pu mal tourner?

J'utilise JDK1.6 sur Mac OS Leopard ayant 2GB RAM.


3 commentaires

Quelle est la taille de ces fichiers (empreinte en mémoire)? Avez-vous observé une mémoire libre avec des outils?


Comment déterminez-vous qu'aucun message d'erreur ou exception n'est généré?


Essayez d'écrire quelques journaux et trouvez où le programme se termine à chaque fois, cela peut donner une idée de la ligne de code du code


5 Réponses :


2
votes

Insérez-vous des fichiers simultanément? Vous pouvez utiliser une mémoire si vous chargez trop de fichiers à la fois. Si les fichiers sont suffisamment grands, vous risquez d'utiliser uniquement un seul fichier ouvert. En outre, assurez-vous de fermer les fichiers lorsque vous avez terminé avec eux.


2 commentaires

La plupart des fichiers sont de taille de 4 Ko et le plus grand est de 193 Ko. La taille de tous les fichiers augmente jusqu'à 20 Mo. Je lis ces fichiers l'un après l'autre. Je vois que ceux-ci sont lus avec succès. Ces fichiers fournissent en fait une contribution à mon programme. Je ne fais pas de changement dans les fichiers. Mon programme aborte au milieu de la transformation des intrants. Si le tas épuisé, je m'attendrais à une exception de mémoire. Depuis, je ne reçois aucun message d'erreur, je n'obtiens aucun indice.


* J'ai fermé tous les fichiers. * Je n'ai pas encore observé la mémoire libre avec des outils? Pouvez-vous suggérer un outil?



1
votes

Vérifiez si vous avez des blocs d'essai / Catch qui ne correspondent pas correctement à des exceptions.

Cela pourrait probablement être stupéfiant. Assurez-vous que la console n'est pas redirigée.


0 commentaires

3
votes

On dirait que vous obtenez OutofMemoryError Code>.

Si c'est le cas, essayez d'augmenter la taille de la mémoire en tas. P>

java -Xms<initial heap size> -Xmx<maximum heap size>


4 commentaires

Oui, j'ai une erreur exceptionnelle, qui provient d'une fonction récursive que dans l'ordre traversant une arborescence de 136600 nœuds. Est-ce dû à la récursion? Devrais-je essayer de supprimer la récursion par boucle? Est-ce possible? Oui, je peux augmenter la taille du tas, que je considère comme la dernière option.


Comment puis-je vérifier la taille du tas actuelle? Dois-je augmenter la taille du tas à chaque fois avant que je gère mon programme?


Vous pouvez utiliser JConsole Utility fourni avec JDK.


Merci à tous, c'était un problème de mémoire, comme je l'ai découvert. Et augmenter les tassize résolvé le problème.



4
votes

Étant donné que c'est votre programme, je vous suggère de faire ce qui suit:

Tout d'abord, modifiez la méthode MAIN de sorte que tout soit fait dans un bloc d'essai / prises qui signale toutes les exceptions non capturées. ; par exemple. Quelque chose comme ceci: xxx

second, recherchez n'importe où que vous pourriez "écraser" des exceptions inattendues en les attrapant et ne les signalant pas.

troisième, regardez Pour n'importe où que vous puissiez appeler system.exit () silencieusement. Cela pourrait aussi se produire dans les bibliothèques ... Si vous utilisez un homme mal écrit.

Si ces mesures ne vous donnent pas de réponses, essayez de comprendre la manière dont l'application est en train de sortir par

  • en fonctionne d'un débogueur avec des points d'arrêt définis aux points clés, ou
  • En ajoutant des relevés d'impression de trace aux points clés.

4 commentaires

Oui, j'ai une erreur exceptionnelle, qui provient d'une fonction récursive que dans l'ordre traversant une arborescence de 136600 nœuds. Est-ce dû à la récursion? Devrais-je essayer de supprimer la récursion par boucle? Est-ce possible?


Je doute que la récursion (d'un arborescence de répertoires de fichiers) lui cause. Vous devez utiliser un profileur de mémoire pour savoir ce qui utilise la mémoire.


Y a-t-il une chance que je puisse voir ce qui se passe quand j'ai la même erreur, mais un essai attraper autour de la main ne produit rien?


@reox - attrapez-vous jetable ?



1
votes

Il y a principalement deux raisons.

  1. Un défaut système "non géré" est survenu I.e. Java.lang.outofMemororyError.
  2. Un défaut d'application "non manqué" s'est produit.
  3. System.exit a été appelé.

    Pour faire face à ces scénarios, considérez les étapes suivantes:

    • Regardez dans votre code pour appels vers System.exit.
    • Assurez-vous que vous gère toutes les exceptions dans le cadre de la pile Java de départ, c'est-à-dire la méthode principale:

      essayer { ..code } Catch (lancable t) { T.PrintStackTrace }

    • Assurez-vous que vous avez le contrôle où STDOUT et STDERR sont dirigés. Vous pouvez les définir de manière programmée sur des fichiers concrets:

      system.setout (Nouveau imprimante ("sortie.txt")); System.seterr (Nouveau imprimante ("errtxt"));

      • Commencez par ARGS AS: -XLOGGC: GC.LOG -XX: + PrintGCDétails -xx: + PrintergcTitalestamps

0 commentaires