Я обрабатываю тысячи документов в цикле, и я заметил, что когда Java-программа достигает определенного количества документов, возникает исключение нехватки памяти Java. Это происходит именно по этой строке:
private String cleanForSolr(File file) throws IOException {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
buffer = new byte[(int) file.length()];
bis.read(buffer);
fis.close();
Pattern p = Pattern.compile("\\<.*?\\>");
contents = em.clean(StringEscapeUtils.escapeHtml(p.matcher(new String(buffer)).replaceAll("")));
return decoder.decode(ByteBuffer.wrap(contents.getBytes())).toString();
}
Я попытался установить параметры -Xms и -Xmx в конфигурации отладки Jbossstudio, но это не имеет значения.
Я не уверен, что он читает поврежденное содержимое файла в определенной части кода и просто не может с этим справиться. Или, если он накапливается в памяти и не может обрабатывать большое количество итераций и накапливать содержимое строки в JVM, которая является неизменной. Есть ли лучший способ написать этот код, чтобы использовать StringBuilder вместо String.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
at java.lang.StringBuffer.append(StringBuffer.java:224)
at java.lang.StringBuffer.append(StringBuffer.java:284)
at java.util.regex.Matcher.appendReplacement(Matcher.java:746)
at java.util.regex.Matcher.replaceAll(Matcher.java:813)
at