J'essaie de limiter la quantité de déchets produits par ma logithèque, j'ai donc codé un test pour me montrer combien de mémoire est créée par FileChannel.write. Le code ci-dessous alloue ZERO mémoire sur mon Mac, mais crée des tonnes de déchets sur ma machine Linux (Ubuntu 10.04.1 LTS), déclenchant le GC. Les FileChannels sont censés être rapides et légers. Existe-t-il une version de JRE où cela a été amélioré sous Linux ?
File file = new File("fileChannelTest.log");
FileOutputStream fos = new FileOutputStream(file);
FileChannel fileChannel = fos.getChannel();
ByteBuffer bb = ByteBuffer.wrap("This is a log line to test!\n".getBytes());
bb.mark();
long freeMemory = Runtime.getRuntime().freeMemory();
for (int i = 0; i < 1000000; i++) {
bb.reset();
fileChannel.write(bb);
}
System.out.println("Memory allocated: " + (freeMemory - Runtime.getRuntime().freeMemory()));
Les détails de mon JRE sont ci-dessous :
java version "1.6.0_19"
Java(TM) SE Runtime Environment (build 1.6.0_19-b04)
Java HotSpot(TM) 64-Bit Server VM (build 16.2-b04, mixed mode)
Mis à jour à :
java version "1.6.0_27"
Java(TM) SE Runtime Environment (build 1.6.0_27-b07)
Java HotSpot(TM) 64-Bit Server VM (build 20.2-b06, mixed mode)
Et ça a bien marché. :-||
Bon, maintenant nous savons que les versions antérieures de FileChannelImpl ont un problème d'allocation de mémoire.