[英]how to improve java code based on this stats?
我有一個Web應用程序,該應用程序每10秒運行一次調度程序任務,即可將某些PCL文件轉換為PDF。 每次最多 從目錄中提取20個pc文件,並將其轉換為pdf。
前幾個任務運行良好,但逐步運行會變慢,並且突然出現GC overhead limit exceeded
錯誤消息。
我試圖用VisualVM分析這種內存泄漏,這是heapdump的一些輸出:
奇怪的是,它顯示了這么多的字節實例 ( 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;
}
你會建議我去哪里看? 我如何才能真正確定我的哪個代碼正在執行此操作?
我無法發布所有代碼,因為有更多類可以進行此轉換,但是我真的希望您能提供一些建議,因為我花了很多時間,但是此內存問題仍然存在。
提前致謝
您的探查器屏幕快照顯示了330萬個java.lang.Byte實例,而不是byte []實例。 我會在其他地方尋找Byte的用法(可能包括從byte自動裝箱以將其插入Collection的實例)。
我的第一個懷疑是代碼的其他部分是將Byte或byte實例添加到映射中(作為鍵或作為值),並且在不再需要它們時無法刪除它們。 但這只是基於跟蹤我自己的一些內存泄漏的猜測。
查看有關使用堆轉儲的VisualVM指南: 這是Oracle的 。
由於組件相同,因此您可能還會查找NetBeans引用,例如, 如何使用Netbeans Profiler查找內存泄漏?
您需要知道誰創建或保留對Byte[]
和Byte
的引用。 攻擊的一種計划是檢查單個Byte[]
實例(“實例視圖”)並查看它們的引用。 “最近的GC根目錄”選項將顯示保留持久Byte[]
的對象的一個路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.