在我的程序中,关闭
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