Java ARM没有';无法正确关闭文件,最终导致打开的文件过多
不确定我的代码的哪一部分确实导致了问题,但当我开始确定问题时,我注意到当我运行以下代码时,打开的文件数增加了Java ARM没有';无法正确关闭文件,最终导致打开的文件过多,java,file,nio,Java,File,Nio,不确定我的代码的哪一部分确实导致了问题,但当我开始确定问题时,我注意到当我运行以下代码时,打开的文件数增加了 public synchronized String readStringSync(String basePath,String path){ if(useLegacy){ return readStringLegacy(basePath,path); }
public synchronized String readStringSync(String basePath,String path){
if(useLegacy){
return readStringLegacy(basePath,path);
}
if(!basePath.endsWith("/"))
basePath+="/";
StringBuffer sb = new StringBuffer(420);
File f= new File(basePath+path);
if(!f.exists()){
return null;
}
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(Paths.get(f.getAbsolutePath()), charset)) {
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line+"\r\n");
}
String ret = sb.toString();
if(ret.trim().startsWith("deleted")||ret.trim().equalsIgnoreCase("dummy"))
return null;
return ret;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
public static void main(String... args) throws Exception{
com.sun.management.UnixOperatingSystemMXBean mxb = (com.sun.management.UnixOperatingSystemMXBean)java.lang.management.ManagementFactory.getOperatingSystemMXBean();
System.out.println(mxb.getOpenFileDescriptorCount()); //11
System.out.println(readString("sometestfile"));
Thread.sleep(1000);
mxb = (com.sun.management.UnixOperatingSystemMXBean)java.lang.management.ManagementFactory.getOperatingSystemMXBean();
System.out.println(mxb.getOpenFileDescriptorCount()); //12 wtf
}
我已经试过去掉File.exists并用Files.exists替换它,但那完全没有用
由于stackoverflow仍在抱怨缺乏细节,因此我使用的java版本如下:
java版本“1.7.0_51”
OpenJDK运行时环境(IcedTea 2.4.4)(7u51-2.4.4-0ubuntu0.13.04.2)
OpenJDK 64位服务器VM(build 24.45-b08,混合模式)try with resources语句正确地关闭了流/读取器,您不必担心这一点
如果您体验到文件保持打开状态,那么这不是由于代码中的错误造成的。如果系统范围内打开的文件相对较少,那么出于性能原因,操作系统甚至JVM可能会将其打开一段时间,如果出现问题,则关闭它们。从您的角度看,您无法做更多的事情,您可以使用
try with resources
语句正确地关闭它。去掉java.nio.parts,并用以下内容替换try行:
try(BufferedReader=new BufferedReader(new FileReader(basePath+path))){
文件计数现在保持在11,但不确定我开始使用java.nio处理的问题是否恢复&还不确定这是否解决了主要问题。useLegacy的值是多少?
readStringLegacy()
中可能存在问题。尝试添加if(true)返回null;就在try块=>文件计数保持在11之前,因此try块编写了一个for
循环,循环次数约为1000次,在该循环中调用相同的readStringSync()
读取同一个文件。打印之后打开的文件计数。尝试将等待时间设为10秒,并用System.gc()将其放在前面,没有效果ZA,仍然有12个打开的文件问题是,整个事情最终开始抛出FileNotFoundException:打开的文件太多,这是我需要担心的。你发布的代码不会导致资源泄漏。如果我找到这个问题,我会查看你代码中的其他地方。结果表明,泄漏的主要原因是确实是在其他地方。打开的文件仍然有一些增加,但要低得多,我不能再让它爆炸成4图了,所以这可能也是由于一些优化。