Имам уеб приложение, което преобразува някои PCL файлове в PDF, като изпълнява задача за планиране на всеки 10 секунди. Всеки път отнема макс. 20 компютърни файла от директория и ги конвертирайте в pdf.
Първите няколко задачи се изпълняват добре, но стъпка по стъпка стават по-бавни и изведнъж се извежда съобщение за грешка GC overhead limit exceeded
.
Опитах се да анализирам това изтичане на памет с VisualVM и ето малко изход от heapdump:
Странно е, че се показва такъв брой байтове екземпляри (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;
}
Къде бихте ме посъветвали да търся? Как наистина мога да идентифицирам кой от кода ми прави това вредно?
Не мога да публикувам целия код, защото има повече класове, които извършват това преобразуване, но наистина се надявам да ми помогнете с някои съвети, защото прекарах много време и все още този проблем с паметта продължава.
Благодаря предварително