JTextArea 占用大量内存

3

我在Java和Swing中遇到了一些内存问题。我有一个JTextArea(使用JTextPane时也有同样的问题),用于重定向来自C++可执行文件的标准输出。由于我输出了大量的stdout,JTextPane占用了很多空间。无论如何,我将其简化为以下所有Java代码。

private javax.swing.JTextArea jtextareastdout;
....

for (int i = 0; i < 200000; i++) {
    String randomstr = UUID.randomUUID().toString();

    jtextareastdout.setText(randomstr);  //<tag_memory>
    if (i % 100 == 0)
        System.gc(); //<tag_no_help>
}

上面的代码消耗了100MB。 如果注释掉tag_memory行,则会少得多(包括我所有的其他代码和UI,只有30MB)。 我该如何减少Java的内存使用? 目前正在使用Java 7更新4版。
提前致谢。

没错,JTextArea 也有很多功能;其中一些你可能不需要。那么,你的实际需求是什么? - trashgod
我主要想展示来自我的C++程序的stdout(和stderr)。我只是不明白所有的内存都去哪了。 - jobobo
1个回答

5

我就是不明白所有内存都去哪了。

PlainDocument 告诉我们一个故事:每个代码点使用一个或两个16位代码单元,一张行起始地图以及使其可编辑的所有障碍。对于只读视图,我会使用重定向:yourprogram 2>&1 > view。在Java中,您可以将输入从stdin读入到一个List<String>中,每行一个String,并用JTable查看它。默认的renderer非常高效。这里有一个相关的例子here


我需要重定向以便读取来自stdout/stderr的信息。JTable?从未考虑过,但也许这是一种方法。对于我上面的代码,我不知何故认为通过.setText()覆盖我的先前字符串会释放先前的字符串进行垃圾回收。内存仍然不断增长,就像它正在泄漏内存一样。有关使上述代码工作的任何线索吗?谢谢。 - jobobo
你需要对实际的代码进行性能分析,以查看是否可以做出其他优化。如果你不使用 JTable,则需要模拟其使用享元模式进行渲染。 - trashgod
是的,jvisualvm 包含在大多数 Oracle 发行版中;NetBeans 使用它或其变体。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接