Arrêt du traitement d'un programme Java [Fermé]

Signaler
-
Messages postés
16365
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
16 juin 2021
-
Bonjour,

j'ai un gros problème lors de l'exécution de mon programme et je n'ai pas réussi à le résoudre malgré les 2 semaines que j'ai pu passer dessus. (Je suis sous linux )

Contexte: Lors du lancement de mon programme sous Eclipse, le programme se lance puis au bout de quelques heures de traitement, Eclipse se ferme sans explication. J'ai donc lancé le programme en batch ( tâche de fond via la console Linux ) et en revenant quelques heures plus tard, linux avait totalement planté, une fenêtre de manière stroboscopique et j'ai du rallumer le PC.

Que fait mon programme ? La partie sur laquelle s'arrête mon programme et celle ou il est censé lister tous les fichiers d'un ensemble de documents et stocker leurs chemins dans une ArrayList de String ( 3.5 millions de fichiers ). La liste est apparemment bien créée ( donc pas de problème de mémoire à ce niveau là apparemment ) puis je modifie chacun des fichiers un par un et en créé un nouveau dans un nouveau dossier. Et c'est en plein milieu de cette partie que mon programme s'arrête puisque la totalité des fichiers n'est pas recréée.

J'ai donc pensé immédiatement que cela était dû à une saturation de la mémoire vive mais je ne vois pas ce qui pourrait consommer de la mémoire vive dans ce qui est fait puisque je ne fais stocker du texte dans une variable String, exploiter cette variable puis écrire son contenu dans un fichier. Et je réutilise cette même variable qui est alors "vidée".
Ce n'est pas non plus un problème de mémoire ROM puisque j'ai largement assez de place ni un problème de saturation des inodes pour la même raison.

J'ai tenté de lancer le programme directement dans la console en augmentant la mémoire utilisable via les options: -Xms1024M -Xmx1024M -Xss512M mais ça n'a rien changé.

Donc de deux choses l'une:
- j'ai mal codé quelque chose ( je ne .close() pas un flux ou un fichier que je devrait fermer) et je sature la mémoire sans m'en rendre compte,
- ma variable ArrayList est trop grande ( je rappelle qu'il y a 4 millions de fichiers à lister) et je sature la mémoire sans m'en rendre compte,
- Un autre problème que je ne connais pas.

Donc ma question, est ce que quelqu'un sait ce qui pourrait empêcher mon programme de tourner correctement svp ?

Et ce que quelqu'un sait comment je pourrais faire en sorte de stocker ma liste de fichier dans la mémoire ROM et non RAM tout en m'en servant pour accéder au fur et à mesure aux chemins de mes fichiers ( accéder ligne par ligne à un fichier texte ).

PS: J'ai oublié une chose très importante, le programme fonctionne correctement lorsque qu'il traite un petit nombre de fichier ( quelques milliers ) donc l'algorithme en lui même est correct.

3 réponses

Messages postés
16365
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
16 juin 2021
2 845
1) Oublie la mémoire ROM, d'une part je ne sais pas si c'est faisable, et j'en doute vu que la mémoire est gérée par la JVM, et d'autre part elle ne sera jamais assez grande pour contenir ton ArrayList en mémoire.

2) On ne connait pas trop la taille des String que tu stockes, ce qui va pas mal jouer sur la consommation mémoire. Avec un petit calcul vite fait, un String stocké dans un ArrayList pèse environ 60 octets + 2 octets par caractère.
Donc pour 4 millions de String avec 50 caractères par String, ce qui fait 600 Mo en mémoire (juste pour une liste). Il suffit qu'à un moment cette liste soit copiée (par exemple si elle est triée...) et ta mémoire est morte.
Est-ce vraiment utile de stocker l'intégralité de cette liste en mémoire ?
On pourrait utiliser la mémoire physique pour libérer la mémoire vive, ce sera plus long, mais le traitement sera complet.

Remarque : j'ai fait mes calculs en 64 bits, mais la taille devrait être moindre en 32 bits, une idée pour diminuer la taille de la mémoire utilisée est de passer en 32 bits, mais là encore, ça risque d'être plus long?

3) Il est tout de même surprenant que tu n'ais aucun message d'erreur, si c'est parce que la console plante, il faudrait peut-être essayer d'enregistrer un fichier log au moment de l'exception (si c'est un problème de mémoire, ce n'est pas sûr qu'il arrive à créer le fichier log)

public static void main(String...args)
{
    try
    {
        // Tout le code que tu as dans le main en ce moment
    }
    catch (Throwable t) // Exception + Error
    {
        System.gc();
        FileOutputStream out = new FileOutputStream("D:/log.txt");
        out.write(t.toString().getBytes());
        for (StackTraceElement x :  t.getStackTrace())
            out.write(x.toString().getBytes());
        out.close();
        t.printStackTrace();
        System.exit(1);
    }
}
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
618
Date d'inscription
vendredi 26 juillet 2002
Statut
Membre
Dernière intervention
13 juillet 2013
971
Salut!

Pourrais-tu poster le code ?

Merci

;-)
Salut j'ai ajouté ton morceaux de code pour créer un fichier log quand il y a une erreur mais apparement ça n'a rien créé.

J'ai aussi modifié mon approche puisqu'au lieu de créer une variable de 4 millions de lignes, je créé juste une variable static de 1000 lignes de textes puis une variable List de quelques milliers de lignes dans une boucle for ( Qui est donc supprimée par le ramasse miettes ).

Néanmoins, en lançant le programma hier soir j'ai eu la suprise , ce matin, d'à nouveau trouver Eclipse fermé sur ma session et le programme qui c'était arrété au même endroit ...

Je précise que je suis sur un ordinateur d'entreprise, pensez vous qu'il puisse y avoir un blocage au niveau du compte ( Délai d'inactivité ou autre ) qui ferme Eclipse ?

Ou sinon, pour quelle raison Eclipse pourrait t il se fermer ?

PS: Je viens de remarquer que même là en relançant Eclipse, il s'est refermé deux fois quand j'ai ouvert mon projet. Oo
Messages postés
16365
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
16 juin 2021
2 845
Même avec le programme le plus mal fait du monde, qui consomme toute la mémoire, qui tourne en boucle infinie ou quoi que ce soit, ce n'est JAMAIS une raison suffisante pour qu'Eclipse plante !
Lances ton programmes en ligne de commande pour voir, ou essaye une autre version d'Eclipse, je pense que là ça ne concerne plus vraiment ton code...