我有一個Web應用程序,它通過每10秒運行一次調度程序任務將一些PCL文件轉換爲PDF。每次最多需要目錄中的20個文件並將它們轉換爲pdf。如何根據此統計數據改進java代碼?
前幾項任務運行良好,但一步一步變慢,突然出現GC overhead limit exceeded
錯誤消息。
我試圖分析其與VisualVM的此內存泄漏,這裏是從堆轉儲一些輸出:
很奇怪的是,字節情況下(3.366.687!)這樣的量是所示。在應用程序中,我也有Streams,我真的檢查過這些流是否在相關操作完成時關閉。
我在三個方法中使用一個類中的字節: 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;
}
你會在哪建議我看看? 我怎樣才能真正識別出我的哪些代碼正在做這些傷害?
我無法發佈所有的代碼,因爲有更多的類來做這種轉換,但我真的希望你能幫我一些建議becauise我花了很多時間,仍然這個內存問題仍然存在。
在此先感謝
你試過了什麼? (有可能你可以看到一些改進,通過積極地將你要求的遊蕩的大字節數組取代它們) – 2011-04-19 19:30:29