【问题标题】:What is memory effects of bufferedwriter close() & flush() methods?bufferedwriter close() & flush() 方法的记忆效应是什么?
【发布时间】:2011-12-05 13:32:46
【问题描述】:

我在这里很困惑。我正在准备 SCJP,我写了一个小递归来检查 BufferedWriter 内存分配 before|after flush() & close() 方法。请看下面的代码块,我刚刚将我的桌面文件写入了一个文本文件。

import java.io.*;

public class Myexception{

    private static String lvl = "";
    static BufferedWriter bw;
    private static File source = new File("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop\\New folder\\myTest.txt");

    public static void main(String[] args) throws IOException {

        Runtime rt = Runtime.getRuntime();

        System.out.println("Free memory before recursive: " + rt.freeMemory());

        bw = new BufferedWriter(new FileWriter(source));

        checkFiles(new File("C:\\Users\\"+System.getProperty("user.name")+"\\Desktop"), 0);

        System.out.println("Memory after recursive: " + rt.freeMemory());

        bw.flush();
        bw.close();
        lvl = null;

        System.out.println("Memory after clean up: " + rt.freeMemory());
    }
    static void checkFiles(File file, int level) throws IOException{

        if(!file.exists()){

            System.out.println("File doesnt exist: " + file.getName() + file.getPath());
            return;
        }

        for(String s:file.list()){

            if(new File(file.getPath() + "\\" +  s).isDirectory()){

                bw.newLine();
                bw.write(lvl + "Directory: " + s);

                lvl += " ";

                checkFiles(new File(file.getPath() + "\\" +  s), level+1);

            }else{

                bw.newLine();
                bw.write(lvl + "File: " + s);

            }
        }
    }
}

输出很好,但我不明白,flush() 和 close() 之前的空闲内存与 flush() 和 close() 之后的空闲内存相同。请看我的输出:

Free memory before recursive: 126150232
Memory after recursive: 104461304
Memory after clean up: 104461304

我检查了现有的主题,但找不到确切的解释。我期待在 bw.close() 之后我会有更多的空闲内存。

谢谢

【问题讨论】:

  • 尝试写大一点的;不能在一个块中写入文件的东西。

标签: java memory flush bufferedwriter


【解决方案1】:

关闭和刷新流与“清理内存”无关,它们确保BufferedStream 中的数据被刷新到流指向的任何位置,例如磁盘或网络套接字。阅读 JavaDoc,它并不暗示这有任何关系或影响垃圾收集。在你把钱浪费在一个毫无价值的认证上之前,你需要回去学习。

【讨论】:

  • +1:刷新和关闭确保缓冲数据写入操作系统。
  • @Jarrod 感谢您的回答,我忘了提及我知道他们确保将缓冲数据写入磁盘。作为问题主题,我只是想知道它们是否也会影响记忆。因为这里coderanch.com/t/550351/Streams/java/… 看了一些gc cmets。 +1 解释。
【解决方案2】:

只有在垃圾收集器运行后才会清理内存。在此之前,您不会看到内存消耗的任何变化。

【讨论】:

  • 谢谢 Nikem 是的,GC 后我得到了不同的结果
猜你喜欢
  • 2017-06-12
  • 2015-07-21
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2012-11-20
  • 2018-05-02
  • 2019-09-27
相关资源
最近更新 更多