JTextArea.setText(NULL);不释放记忆

时间:2012-07-08 17:15:22

标签: java swing memory-leaks jtextarea

我正在使用Swing,我有一个包含几个JPanel的JFrame,其中一个有一个JTextArea。

当用户点击某个菜单( ActionListener.actionPerformed(populate()))时,会设置JTextArea内容。

内容取自30MB的文本文件:

private void populate () {
        StringBuilder strB = new StringBuilder();
        try {
            FileReader fr = new FileReader("file30mb.txt");
            BufferedReader br = new BufferedReader(fr);
            String strLine;

            while ((strLine = br.readLine()) != null) {
                strB.append(strLine).append(System.getProperty("line.separator"));
            }

            fr.close();
            br.close();
        } catch (IOException e) {
            System.err.println(e);
        }

        jTextArea1.setEditable(false);
        jTextArea1.setText(strB.toString());
        jTextArea1.setCaretPosition(0);
}

此过程占用大量内存,大约200MB。

还有另一个菜单,当用户点击它时,JTextArea被清除(基本上它调用的方法是 jTextArea1.setText(null))。该事件的处理方式与之前相同: ActionListener.actionPerformed(free())

因此,当JTextArea为空时,我希望内存使用率低于之前......但不幸的是,这不是真的。如果我进入任务管理器,我会看到之前相同的内存使用量(约200MB),但JTextArea是空的!

我错过了什么?

编辑我也试过了:

jTextArea1.setText(strB.toString());
jTextArea1.setText("");
Runtime r = Runtime.getRuntime();
r.gc();
System.out.println(jTextArea1.getDocument().getLength()); // prints "0"

但它仍然需要200MB的内存。

编辑2 如果我删除“GUI部分”(我的意思是jTextArea1.setText()等),它仍然需要大量内存。它应该采用“0内存”,因为我没有在JTextArea中写任何东西,但我只读了一个文本文件,然后什么都不做。我错了吗?

1 个答案:

答案 0 :(得分:3)

几个原因:

  • 垃圾收集定期运行,不会立即释放内存

  • JVM进程内存和堆内存使用是两个截然不同的事情。启用详细的GC日志记录或使用jconsole / jvisualvm连接到您的应用程序并检查实际堆使用情况。手动运行GC

  • Ctrl + Z 是否还在工作,允许您恢复以前的(30 MB)内容?你明白了......

如果这些都不正确,请使用Eclipse MAT之类的内存分析器来查找对这个巨大对象的引用内容(您将找到大小为60 MB的char[])。

相关问题