【问题标题】:JTextArea consumes a lot of memoryJTextArea 消耗大量内存
【发布时间】:2012-07-03 10:00:16
【问题描述】:

我在使用 Java 和 Swing 时遇到了一些内存问题。我有一个JTextArea(与JTextPane 相同的问题),用于从C++ 可执行文件重定向标准输出。而且因为我输出了很多标准输出,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 行,少了很多(30MB 加上我所有的其他代码和 UI)。如何减少 Java 的内存使用量?当前使用 Java 7 更新 4。

提前致谢。

【问题讨论】:

  • 是的,JTextArea 也有很多功能;有些你可能不需要。您的实际要求是什么?
  • 我主要想从我的 c++ 程序中显示我的标准输出(和标准错误)。我只是不明白所有的记忆都去哪儿了。

标签: java swing document jtextarea


【解决方案1】:

我只是不明白所有的记忆都去哪儿了。

PlainDocument 讲述了这个故事:每个代码点一个或两个 16 位代码单元,一个行映射开始,以及使其可编辑所需的所有障碍。对于只读查看,我会使用重定向:yourprogram 2&gt;&amp;1 &gt; view。在 Java 中,您可以将stdin 读入List&lt;String&gt;,每行一个String,并使用JTable 查看它。默认的renderer 非常有效。有一个相关的例子here

【讨论】:

  • 我需要重定向,以便我可以读取来自 stdout/stderr 的信息。表?从来没有考虑过,但也许这是一条路要走。对于我上面的代码,我不知何故认为覆盖我以前的字符串(通过 .setText())会释放以前的字符串以进行垃圾收集。内存一直在增长,就好像它正在泄漏内存一样。关于使上述代码工作的任何线索?谢谢。
  • 您需要分析您的实际代码以查看是否可以做任何其他事情。如果您不使用JTable,则需要模拟它使用享元模式进行渲染。
  • 是的,jvisualvm 包含在大多数 Oracle 发行版中; NetBeans 使用它或变体。
猜你喜欢
  • 2022-01-16
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多