gpt4 book ai didi

java - JTextArea.setText(null);不释放内存

转载 作者:行者123 更新时间:2023-12-02 00:19:05 25 4
gpt4 key购买 nike

我正在使用 Swing,并且有一个包含一些 JPanel 的 JFrame,其中一个 JPanel 内部有一个 JTextArea。

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

内容取自 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 中写入任何内容,但我只是读取了一个文本文件,然后什么也不做。我错了吗?

最佳答案

几个原因:

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

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

  • Ctrl + Z 是否仍然有效,允许您恢复以前的 (30 MB) 内容?你明白了...

如果这些都不正确,请使用内存分析器,如 Eclipse MAT找出这个巨大对象的引用(您会发现 char[] 大小为 60 MB)。

关于java - JTextArea.setText(null);不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com