Question

Bonjour, java utilise beaucoup de fichiers temporaires et mon problème est qu’ils ne sont pas supprimés.

Sans avoir à mettre en œuvre ma propre gestion de la gestion de fichiers temporaire (ce n'est pas difficile, je vous l'accorde, mais je suis paresseux et j'ai tellement de choses à faire si je peux économiser en réinventant la roue pour le meilleur), existe-t-il un moyen de garantir les fichiers temporaires sur le disque seront supprimés de manière assez régulière.

1 - en utilisant le fichier tmp = File.createTempFile (), je peux certes dire tmp.deleteOnExit (), mais si la chose est exécutée dans un service, la seule façon de la quitter est le moment où elle se bloque (arrive rarement) ou le système se bloque (comme lorsque le lecteur est complètement rempli de fichiers temporaires et renverse le cluster ... oups!)

Idéalement, le ramasse-miettes rassemble les instances créées à un moment donné. Etant donné qu’il ya BEAUCOUP de temps d’inactivité dans l’application, il serait inutile que le GC puisse, ainsi, terminer son nettoyage et le supprimer. le fichier sur le disque aussi bien quand déréférencer l'instance de la mémoire.

le seul moyen que je vois pour l'instant est de surcharger la classe File et d'ajouter une méthode finalisée ... Si je le fais, cela pourrait aussi bien aller avec mon propre gestionnaire de fichiers temporaire!

Bref récit, puis-je utiliser le collecteur de place pour nettoyer également les ressources système (c'est-à-dire les fichiers)?

Merci à tous pour vos réponses. J'ai accepté Christoffer car c'était le plus simple à mettre en œuvre et c'est ce que j'ai fini par faire.

Je suppose qu'être nettoyé après tant d'années, m'a fait oublier l'entretien de base que je pensais être difficile à faire à l'époque bienfaisante de C ++.

Était-ce utile?

La solution

Bien sûr, vous pouvez. La question est de savoir si vous voulez vraiment:)

J'ai effectivement rencontré ce problème dans la nature; Comme vous l'avez remarqué, le nettoyage de fichiers temporaires avec deleteOnExit () est inutile lors de l'exécution d'un service plutôt que d'une application. J'ai trouvé que la solution la plus stable consistait à restructurer le flux du programme de manière à ce que les fichiers temporaires soient créés tâche par tâche et explicitement supprimés lorsqu'ils ne sont plus nécessaires.

Si vous le faites autrement, c'est-à-dire si le programme est incapable de déterminer si un fichier temporaire doit être conservé ou supprimé à un moment quelconque de l'exécution, vous risquez de rencontrer un problème de conception. Envelopper des fichiers dans un harnais de gestionnaire ne ferait que reporter le & "Vrai &"; solution;)

Autres conseils

Vous voudrez peut-être examiner PhantomReference :

  

Objets de référence fantômes, qui sont mis en file d'attente après que le collecteur a déterminé que leurs référents peuvent sinon être récupérés. Les références fantômes sont le plus souvent utilisées pour planifier des actions de nettoyage pré-mortem de manière plus flexible que ne le permet le mécanisme de finalisation Java.

Compter sur un événement à déclencher lorsque votre classe est détruite ne sera pas infaillible et risque de laisser des fichiers derrière vous.

Je pense que le moyen le plus simple et le plus fiable de nettoyer vos fichiers temporaires est le suivant:

  • Ecrivez un gestionnaire d'événement à la fermeture de votre programme pour nettoyer les fichiers que vous avez ouverts au cours de votre session actuelle.
  • Ecrivez une procédure à exécuter au démarrage du programme, qui supprime tous les fichiers temporaires de ce dossier datant de plus de 24 heures.

Avec cette approche, vous ne devez pas craindre que votre programme se bloque pour une raison quelconque et laisse des fichiers temporaires, et vous n'avez également pas à vous soucier de la suppression par le programme des fichiers toujours en cours d'utilisation.

La récupération de place est l’espace de noms incorrect pour ce type de traitement de l’information.

Le point suivant devrait suffire à gérer les fichiers temporaires.

  1. Vous devriez essayer de supprimer le fichier directement après ne plus l’utiliser. Un bloc de finalisation peut gérer cela.

  2. DeleteOnExit à utiliser.

  3. Vous pouvez créer vos fichiers temporaires dans un répertoire temporaire spécial. Ce répertoire temporaire que vous pouvez supprimer lors du lancement et de la fermeture de l’application, pour vous assurer qu’aucun fichier temporaire n’existe après la fermeture de l’application.

Le ramasse-miettes n'est pas utile pour de telles choses. Il est conçu pour la gestion de la mémoire et peut comporter de nombreux inconvénients.

  • Votre objet peut être collecté longtemps après que le fichier n'est plus utilisé.
  • Votre objet n'est pas garanti d'être collecté.

Les deux choses se produisent particulièrement souvent, si Java est démarré avec une grande taille de segment de mémoire - une chose qui n'est pas inhabituelle côté serveur.

À un moment donné de votre programme, vous devez fermer les Streams sur ce fichier (sinon, vous mangerez des descripteurs de fichiers système qui rendraient le système inutilisable, ce que je faisais déjà). Au moment où vous fermez les flux, vous pouvez également supprimer le fichier associé. C’est le moyen le plus propre.

Vous pouvez créer un wrapper pour un fichier qui utilise un finalizer pour supprimer votre fichier lorsque l’objet est nettoyé.

Mais les finaliseurs ne sont pas appelés de manière prévisible, je ne le recommanderais donc pas du tout.

Garbage Collector n’est pas un endroit pour libérer ce type de ressources. Veuillez consulter ces deux articles ci-dessous pour savoir comment libérer des ressources en Java. http://c2.com/cgi/wiki?ReleasingResourcesInJava Et aussi les problèmes de performances avec les finaliseurs Java. Ils peuvent donner un aperçu et une compréhension de la manière dont il devrait être utilisé. http://www.enyo.de/fw/notes/java- gc-finalizers.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top