java – 关闭RandomAccessFile有时需要45秒

在我的程序中,关闭 java.util.RandomAccessFile有时需要45秒(几乎恰好在44.998和45.003秒之间).该程序创建和关闭大量小文件.通常关闭文件非常快(0到0.1秒之间).如果我调试该程序,它将被粘贴在本地方法RandomAccessFile.close0中.

当使用FileOutputStream而不是RandomAccessFile(在这种情况下,程序在本地方法FileOutputStream.close0中被阻止)时,也会出现同样的问题.

有人有想法可能是什么?你可以重现系统上的问题(我只能在Mac上重现,而不是在Windows XP上,我还没有在Linux上测试)?

更新2:

这仅仅是在Mac OS X上发生.我使用JDK 1.6.0_22-b04.它发生在32位和64位.在Windows XP上似乎并没有发生.

我的测试用例是:

import java.io.File;
import java.io.RandomAccessFile;
public class TestFileClose {
    public static void main(String... args) throws Exception {
        for (int i = 0; i < 100000; i++) {
            String name = "test" + i;
            RandomAccessFile r = new RandomAccessFile(name,"rw");
            r.write(0);
            long t = System.currentTimeMillis();
            r.close();
            long close = System.currentTimeMillis() - t;
            if (close > 200) {
                System.out.println("closing " + name +
                        " took " + close + " ms!");
            }
            if (i % 2000 == 0) {
                System.out.println("test " + i + "/100000");
            }
            new File(name).delete();
        }
    }
}

在我的机器上输出示例:

test 0/100000
test 2000/100000
test 4000/100000
test 6000/100000
test 8000/100000
test 10000/100000
closing test10030 took 44998 ms!
test 12000/100000
test 14000/100000
test 16000/100000
closing test16930 took 44998 ms!
test 18000/100000
test 20000/100000

解决方法

这可能是我的机器上安装的McAfee防病毒软件.我不得不安装它…但是如果禁用按访问扫描,问题也会显示出来.

为了唯一的方法来验证它不是防病毒是有人在他的机器上重复测试(没有防病毒),并得到相同的问题,我猜.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...