0

ディレクトリ (6GB) 内にすべてのファイルを割り当てる Java クラスがあります。次に、ファイルごとにテキスト処理を行います。RAM の使用状況を確認すると、あるファイルを終了して次のファイルを開始したときに、RAM が前のファイルを削除していないことがわかります。ガベージ コレクションが悪いのではないでしょうか。完成したファイルとそのデータをプログラムで解放する方法はありますか?

public void fromDirectory(String path) {

        File folder = new File(path);
        disFile = path + "/dis.txt";
        if (folder.isDirectory()) {
            File[] listOfFiles = folder.listFiles();

            for (int i = 0; i < listOfFiles.length; i++) {
                File file = listOfFiles[i];
                if (file.isFile() && file.getName().contains("log")) {
                    System.out.println("The file will be processed is: "
                            + file.getPath());
                    forEachFile(file.getPath());
                    //Runtime.getRuntime().exec("purge");
                    //System.gc();

                } else
                    System.out.println("The file " + file.getName()
                            + " doesn't contain log");
            }

        } else {
            System.out.println("The path: " + path + " is not a directory");
        }

}

private void forEachFile(String filePath) {
    File in = new File(filePath);
    File out = new File(disFile);

    try {
        out.createNewFile();
        FileWriter fw = new FileWriter(out.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);
        BufferedReader reader = new BufferedReader(new FileReader(in));

        String line = null;
        while ((line = reader.readLine()) != null) {

            if (line.toLowerCase().contains("keyword")) {
                bw.write(line);
                bw.newLine();
                numberOfLines++;
            }
        }
        reader.close();
        bw.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}
4

4 に答える 4

0

ここで 2 つのことを誤解していると思います。JVM のメモリ割り当てと、割り当てられたスペース内の実際のメモリ使用量です。

JVM は大量のメモリを割り当て、それを使用していたオブジェクトが内部でガベージされた後でも解放しない場合があります。しばらくすると解放されるか、まったく解放されない可能性があります。

toLowerCase は新しいオブジェクトを作成するため、たとえば toLowerCase を使用しないことで、アプリケーションのメモリ フットプリントを減らすことができます。たぶん、プリコンパイルされた正規表現検索の方が速いでしょうか?

System.gc()私の意見では、あなたの場合、あなたがしたように使用することは受け入れられます。それが何かに役立つかどうか - 私にはわかりません。

大量のメモリが利用可能であり、Java の速度が低下しない限り、それ以上割り当てることができないため、そのままにしておきます。コードは問題ないようです。

于 2013-05-09T09:39:03.137 に答える