Java TextArea在读取大输出时使用大量RAM

Java TextArea在读取大输出时使用大量RAM,java,Java,我的程序执行系统命令,并逐行返回输出,然而,有两个命令会产生大量的行,在这种情况下,RAM使用率上升到~700Mbs,知道任何其他命令中通常的RAM使用率为50-60Mbs 这是一个使用BufferedReader处理读取输出的方法,它由另一个处理命令进程创建的方法调用。它还将输出逐行传递给showOutputLine()方法,该方法将把它打印到控制台或文本区域 protected void formatStream(InputStream inputStream, boolean is

我的程序执行系统命令,并逐行返回输出,然而,有两个命令会产生大量的行,在这种情况下,RAM使用率上升到~700Mbs,知道任何其他命令中通常的RAM使用率为50-60Mbs

这是一个使用BufferedReader处理读取输出的方法,它由另一个处理命令进程创建的方法调用。它还将输出逐行传递给showOutputLine()方法,该方法将把它打印到控制台或文本区域

    protected void formatStream(InputStream inputStream, boolean isError) {

    bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String tempLine = null;

    // Read output
    try {
        while ((tempLine = bufferedReader.readLine()) != null) {
            showOutputLine(tempLine, isError);
        }
    } catch (IOException e) {// just stop
    }

}
导致问题的命令的一个示例:

亚洲开发银行日志


编辑:BufferedReader似乎是无辜的,但问题仍然存在。由JTextArea引起。

BufferedReader在固定大小的数组中始终使用大约16KB(8K*2字节字符)。如果您使用的不止这些,这是生成这么多字符串(特别是如果您有很长的文本行)的副作用,而不是BufferedReader本身

TextArea可以保留更多的内存使用量,具体取决于文本的长度

在任何情况下,真正重要的内存使用是完整GC后堆的大小,其余的是各种开销


顺便说一句,Mb=兆字节,Mb=兆字节。

不,不是。TextArea有。我测试过,我将输出打印到控制台,完全忽略了TextArea,但这并没有解决问题。你能分享showOutputLine的实现吗?第124行:outputObject是一个接口的实例,用户可以配置为将输出重定向到控制台或任何其他首选对象。请尝试根本不打印输出,或不调用读取循环中的任何内容
BufferedReader
只使用了几个K。这不是这里的问题。那么有没有关于使用UI正确处理这个问题的建议?如果可能的话,请阅读我在OP上的评论,了解我的具体情况。@mh6将JTextArea中的数据量保持在最低限度,否则会占用更多内存。特别是,它可能会将整个文本体周围的图像缓冲为矩形。大量的文本(特别是如果有长行)会占用大量内存。