Bonjour à tous.
Je suis confronté à un problème mémoire lié aux MappedByteBuffer récupérés via java.nio.FileChannels.FileChannel.map(..) :
J'ai une méthode qui consiste à faire une recherche dans un fichier binaire, et pour cela, à chaque fois qu'elle est appelée :
- elle crée le FileInputStream, récupère le FileChannel correspondant, et récupère la référence sur le MappedByteBuffer via la méthode "map(...)".
- elle ferme correctement les flux (FileInputStream et FileChannel) dans le bloc "finally"
- elle va même dans ce bloc "finally" jusqu'à faite un "clear" du MappedByteBuffer si ce dernier n'est pas nul.
Mon problème :
Si j'exécute une à deux fois cette méthode dans mon main (via une boucle), pas de soucis.
Si je veux l'exécuter une vingtaine de fois, ça plante :
java.io.IOException: Espace insuffisant pour traiter cette commande
at sun.nio.ch.FileChannelImpl.map0(Native Method)
at sun.nio.ch.FileChannelImpl.map(Unknown Source)
at com.iohack.binarytools.BinaryFile.searchRecords_NIO_MappedMode(BinaryFile.java:87)
at com.iohack.binarytools.BinaryFile.main(BinaryFile.java:253)
Je suis étonné de ce comportement, on dirait que le garbage collector ne fait pas son travail de récupération de la mémoire.
J'ai peut-être un début d'explication : le mapping de nio délègue au système d'exploitation les accès au fichier. Exécutant mon job sous cette saloperie de windows XP, je souspçonne que c'est ce dernier qui ne sait pas gérer la libération mémoire...
La trace de l'exception étant vraiment simplissime et la javadoc de même : "IOException - If some other I/O error occurs", je me demande quel est l'intérêt d'utiliser une méthode aussi peu fiable alors qu'elle est censée apporter certaines optimisations... Les packages du JDK ne seraient donc plus multi-plateforme ? (j'espère me tromper)...
Si quelqu'un a une explication et/ou une solution de contournement (vidage explicite de la mémoire) j'en serais fort intéressé![]()
Partager