java - 读取大输出时 TextArea 会使用大量 RAM

标签 java

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

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

    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
    }

}

导致问题的命令示例:

adb logcat

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

最佳答案

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

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

无论如何,真正重要的内存使用量是 Full GC 后堆的大小,剩下的就是各种开销。

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

关于java - 读取大输出时 TextArea 会使用大量 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43720892/

相关文章:

java - 如何在 Android 和 Rest 上使用密码学处理信用卡信息

java - 如何在 JPA 存储库方法中使用部分组合键来获取数据?

java - 为什么一个整数与一个数字连接会产生一个字符串?

Ubuntu 中的 Java 运行时错误 - 在代码中放置 javax.net.ssl.trustStore 的位置?

java - 使用 Java 8 流映射函数来执行长时间运行的任务

java - 如何获取使用 FileOutputStream 保存的文件的 URI?

java - 使不同的 TreeSet 保持与另一个 TreeSet 相同的顺序

java - 从接口(interface)设置 Jersey 响应状态代码而不返回 Response

java - 当偏移量存在时,如何消耗kafka frome的最大偏移量?

java - 无法使用 Spring Boot 和 Hibernate 连接到 Oracle