有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JTextArea。setText(空);不会释放内存

我使用的是Swing,我有一个JFrame,其中包含一些JPanel,其中一个里面有一个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。执行的操作(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) 个答案

  1. # 1 楼答案

    原因如下:

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

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

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

    如果这些都不对,那么使用Eclipse MAT之类的内存探查器来找出是什么保存了对这个巨大对象的引用(你会发现大小为60MB的char[]