Forcer Java à libérer tous les verrous / poignées de fichiers en Java
Mon application Java (ce qui est tout à fait un peu de code) fait beaucoup d'opérations sur les fichiers. À un moment, dans mon application, j'ai besoin de déplacer un fichier d'un emplacement à un autre et pour cela, je suis en utilisant le Files.move
méthode de JDK7.
Quand j'essaie de faire ceci, j'obtiens une erreur me disant que le fichier est en cours d'utilisation. Je sais pour un fait que c'est une partie de mon code de verrouillage de cette ressource.
Comment je force mon application Java pour la libération de tous les verrous avant l'appel de la fonction qui déplace/renomme mon fichier?
Si ce n'est pas possible, est-il un moyen facile de vérifier quelle partie de mon code verrouillage d'un fichier? Péniblement à travers l'ensemble de ma base de code pour trouver unclosed descripteurs de fichiers serait un cauchemar compte tenu de la quantité de code, il est.
Grâce
source d'informationauteur Mridang Agarwalla
Vous devez vous connecter pour publier un commentaire.
Le Fichier() de l'Objet ne marche pas verrouiller un fichier, mais un FileStream (FileInputStream/FileOutputStream) ce qu'il se verrouille. Donc, vous devez écrire un HelperClass (par exemple, Singleton) pour votre Ruisseaux, dont le journal de tous les cours d'eau.
Mais attention, si Vous avez une fuite dans votre code, c'est beaucoup mieux pour corriger le bug de clôture dur tous les fichiers.
Avec l'aide d'un débogueur, vous pouvez voir toutes les instances d'objets que vous avez en mémoire (dans Netbeans ce serait Windows | Débogage | Classes Chargées, puis clic droit -> Afficher les instances). Vous pouvez ensuite voir tous les
FileInputStream
/FileOutputStream
instances que vous avez, et de déterminer celles qui pointe vers le fichier que vous voulez déplacer. Une fois que vous avez trouvé la référence de votre dossier, vous pouvez voir qui tient encore la référence.Si il n'y a personne détenant une référence vers le fichier, peut-être que l'instance ait été rejeté sans appel
close()
et le fichier est normalement libéré seulement après la collecte des ordures. Cela rend l'approche précédente inutile, car je pense que le débogueur serait automatiquement des ordures recueillir ces flux pour vous. Peut-être pourrais-tu mettre un point d'arrêt conditionnel à l'intérieur du flux de constructeur, et dites-lui d'arrêter uniquement lorsque le paramètre de constructeur se réfère à votre fichier.Si vous ne pouvez pas trouver quoi que ce soit, en dernier recours, vous pouvez essayer de mettre un couple de
System.gc()
appels avant votre opération de déplacement, et de voir si vous avez la moindre amélioration. Clairement, ce serait seulement à la va-vite corrigé, pour vous donner un certain temps jusqu'à ce que vous trouver le problème.Toute autre solution que de fermer correctement les flux (de préférence à l'intérieur d'un
try.. finally
bloc) sera un désastre travail et risque de rendre les choses plus instable qu'ils ne le sont déjà.Je sais que c'est une douleur pour résoudre ce problème dans une grande base de code. Si vous ne voulez pas de se frayer un chemin dans votre code, FindBugs est bon à localiser unclosed ruisseaux. Il y a un plugin Eclipse et vous pouvez filtrer les bugs qu'il trouve à seulement ceux qui vous intéressent.