У меня есть веб-приложение, которое преобразует некоторые файлы PCL в PDF, запуская задачу планировщика каждые 10 секунд. Каждый раз требуется макс. 20 файлов ПК из каталога и конвертировать их в pdf.
Первые несколько задач выполняются хорошо, но постепенно они становятся медленнее, и внезапно появляется сообщение об ошибке GC overhead limit exceeded
.
Я попытался проанализировать эту утечку памяти с помощью VisualVM, и вот некоторые результаты дампа кучи:
Странно, что такое количество экземпляров байтов (3.366.687 !!!) показано. В приложении у меня также есть потоки, и я действительно проверил, закрываются ли все эти потоки, когда выполняются связанные с ними операции.
Я использую byte в одном классе в трех методах: byte[] buf = new byte[1024];
public void initBuf() {
if (buf != null) {
for (int i = 0; i < buf.length; i++) {
buf[i] = (byte) 0x00;
}
pdf_y = PageSize.A4.getHeight();
}
}
public void appendBuf(char ch) {
if (ch == '\n') {
processChunk();
drawChunks();
pdf_newline();
} else if (ch != '\r') {
buf[buf_index++] = (byte) (0xff & ch);
}
}
public void resetBuf() {
for (int i = buf_index; i >= 0; i--) {
buf[i] = (byte) 0x00;
}
buf_index = 0;
}
Где бы вы посоветовали мне искать? Как я могу действительно определить, какой из моего кода делает это вредно?
Я не могу опубликовать весь код, потому что есть больше классов, которые делают это преобразование, но я очень надеюсь, что вы поможете мне с некоторыми советами, потому что я потратил много времени, и все еще эта проблема с памятью сохраняется.
заранее спасибо