4

私のJavaコードにはハンドルリークがあるようですが、それをチェックするのに適したデバッグツールはどれですか?

4

2 に答える 2

4

例が示されていないので、私は私のものを追加しています

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

また、ファイルリークディテクタまたはFLDJenkinプラグインを使用できます

于 2016-05-08T00:13:44.410 に答える
3

lsofコマンドは、プログラムに関連付けられているすべてのファイルを一覧表示します。

于 2012-07-31T23:09:51.847 に答える