簡體   English   中英

Java中的內存泄漏

[英]Memory leakage in Java

該代碼應打開一個文本文件,跳過第一行,將其余各行復制到temp變量,清除文件,然后將temp變量重寫到文件中。

我懷疑這段代碼正在產生內存泄漏,盡管我正在清除並關閉所有對象。 我在這里想念什么嗎?

這段代碼每秒被調用30次以上。

            Scanner scanner_live = new Scanner(file_live);
            ArrayList<String> coll = new ArrayList<String>();
            scanner_live.nextLine();
            while (scanner_live.hasNextLine()) 
                                {
                String line = scanner_live.nextLine();
                coll.add(line);}
            scanner_live.close();

            PrintWriter writer_del = new PrintWriter(file_live);
            writer_del.print("");
            writer_del.close();

            for (String line : coll) {
            FileWriter writer = new FileWriter(file_live.getAbsoluteFile(),true);
            BufferedWriter bufferedWriter = new BufferedWriter(writer);
            bufferedWriter.append(line);
            bufferedWriter.newLine();
            bufferedWriter.close(); 
            writer.close();
                                    }
            coll.clear();

我建議您避免存儲所有行。 相反,您可以在讀取數據時將其復制。 實際上,您不需要在第一行之后解析每一行,只需復制其余數據即可。

try(BufferedReader in = new BufferedReader(new FileReader(file_live);
   BufferedWriter out = new BufferedWriter(new FileWriter(file_live+".tmp"))) {
   // skip the first line
   in.readLine();
   char[] buffer = new char[8*1024];
   for(int len; (len = in.read(buffer)) > 0;)
       out.write(buffer, 0, len);
}
new File(file_live).delete();
new File(file_live+".tmp").renameTo(new File(file_live));

順便說一句:這種方式一次消耗一行非常昂貴,特別是如果文件很大。 如果可以的話,我建議不要完全重寫該文件,而應單獨記錄您要寫的那一行。

您的算法,但更正確。

    File file = ...
    List<String> lines = new ArrayList<>();
    try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
        // skip first
        String line = reader.readLine();
        while ((line = reader.readLine()) != null) {
            lines.add(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    try (PrintWriter writer = new PrintWriter(new FileWriter(file))){
        for (String line : lines) {
            writer.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

另外,如果文件很小,我看不到內存泄漏。 但是,如果文件很大,那是因為您將所有行都保留在內存中。 JVM內存!=您計算機上的所有內存。 因此,JVM可能會超出限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM