linux write效率不稳定,Linux上的FileChannel.write会产生大量的垃圾,但不会在Mac上

博主在测试中发现Java的FileChannel.write方法在Mac和Linux上表现不同,Mac上不产生内存垃圾,但在Linux上(具体版本Ubuntu 10.04.1 LTS)会导致大量内存分配和垃圾收集。这个问题在更新JRE到1.6.0_27版本后得到了解决。博客探讨了这个问题,并分享了一个测试用例,以及如何实现一个在写入日志时不分配内存的记录库。
摘要由CSDN通过智能技术生成

我试图限制由我的日志库产生的垃圾数量,所以我编写了一个测试来向我显示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 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值