我试图限制由我的日志库产生的垃圾数量,所以我编写了一个测试来向我显示FileChannel.write创建了多少内存。下面的代码在我的Mac上分配ZERO内存,但是在我的Linux机器上(Ubuntu 10.04.1 LTS)创建大量垃圾,触发GC。 FileChannels应该是快速和轻量级的。有没有一个JRE版本在Linux上更好?Linux上的FileChannel.write会产生大量的垃圾,但不会在Mac上
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()));
我JRE的细节如下:
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)
更新为:
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)
它工作得很好。 : - |
那么,现在我们知道FileChannelImpl的早期版本有一个内存分配问题。
+2
当我在linux上使用java 1.6.0_26运行这个时,它说内存分配为“0”。 –
+0
同样在这里:但我在11.04。我没有10.04测试,对不起。 –
+1
正如一个侧面说明,我能够编写一个记录库,在登录到磁盘时分配ZERO内存。更多详细信息,请访问:http://mentalog.soliveirajr.com –