java outOfMemoryError 与 stringbuilder

标签 java string out-of-memory heap-memory stringbuilder

当我调用这个方法时,我得到了一个 java outOfMemoryError - 我在一个循环中使用它来按顺序解析许多大文件。我的猜测是 result.toString() 在循环期间没有正确收集垃圾。如果是这样,我该如何解决?

private String matchHelper(String buffer, String regex, String method){
    Pattern abbrev_p = Pattern.compile(regex);//norms U.S.A., B.S., PH.D, PH.D.
    Matcher abbrev_matcher = abbrev_p.matcher(buffer);
    StringBuffer result = new StringBuffer();
    while (abbrev_matcher.find()){
            abbrev_matcher.appendReplacement(result, abbrevHelper(abbrev_matcher));
    }
    abbrev_matcher.appendTail(result);
    String tempResult = result.toString(); //ERROR OCCURS HERE
  return tempResult;

}

最佳答案

这样写,文件中的每个字符大约需要 6 字节的内存。

每个字符是两个字节。您拥有原始输入、替代输出(在缓冲​​区中),并且在内存不足时请求第三份副本。

如果文件以类似 ASCII 或 ISO-8859-1(单字节字符编码)的方式编码,这意味着它在内存中的大小将是在磁盘中的六倍。

您可以为进程分配更多内存,但更好的解决方案可能是“流式”处理输入——读取、扫描和写入数据,而不是一次将所有数据加载到内存中。

关于java outOfMemoryError 与 stringbuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431040/

相关文章:

java - 分配大于堆的数组时出现意外的 OutOfMemoryError

python - 为什么 python 列表比 numpy 数组能容纳更多数据?

java - Spring Boot属性到对象

java - 无法在 CriteriaBuilder 构造方法中调用数据库函数

python - 在字符串 python 中使用 string.format 和 "{"

ruby - 我如何检查一对单词是否只有 1 个字母不同?

scala - 使用 Scala 以函数方式解决项目 Euler 25

java - 从 Java Web Start 运行 Tomcat

java - Hibernate MappingException 未知实体 : $Proxy2

c++ - 将 char 指针中的字符替换为 memmove