2012-07-31 73 views
0

我的java代碼似乎有句柄泄漏,哪個調試工具適合檢查?如何檢查Java程序的文件句柄泄漏?

+1

分享你的代碼,以便其他人可以看到你在說什麼。 – 2012-07-31 23:07:45

+0

讓我猜:「FileNotFoundException:太多打開的文件」? 如果在java調試器*中有更多的方法來跟蹤打開的文件句柄,那將會很不錯。大多數時候單獨使用「lsof」是不足以真正追蹤這樣的錯誤的。 + 1'd – 2012-08-01 05:52:48

回答

1

lsof命令將列出與程序關聯的所有文件。

0

由於沒有已經給出,我加入我的

package org.gradle; 

import java.io.File; 
import java.io.FileDescriptor; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
public class FileDescriptorDemoOne { 

    static int index_count; 
    public static void main(String[] args) throws IOException { 
     ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); 
     exec.scheduleAtFixedRate(new Runnable() { 
      public void run() { 
       index_count++; 
      // do stuff 
       File file = new File("/tmp/helloworld.txt"); 
       FileDescriptor fd; 
       FileOutputStream fos1; 
       try { 
        fos1 = new FileOutputStream(file); 
        fd = fos1.getFD(); 
        //passing FileDescriptor to another FileOutputStream 
        FileOutputStream fos2 = new FileOutputStream(fd); 
        fos2.write(index_count++); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }, 0, 5, TimeUnit.SECONDS); 
    } 
} 

顯然上面的代碼會泄漏文件描述符每隔幾秒鐘。

爲了趕上這個運用

lsof的| grep的HelloWorld的

java  6015 vic 8w  REG    1,4   12 86076888 /private/tmp/helloworld.txt 
java  6015 vic 9w  REG    1,4   12 86076888 /private/tmp/helloworld.txt 
java  6015 vic 10w  REG    1,4   12 86076888 /private/tmp/helloworld.txt 

上也可以使用File Leak DetectorFLD Jenkin Plugin