簡體   English   中英

如何基於此統計信息改進Java代碼?

[英]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的實例)。

我的第一個懷疑是代碼的其他部分是將Bytebyte實例添加到映射中(作為鍵或作為值),並且在不再需要它們時無法刪除它們。 但這只是基於跟蹤我自己的一些內存泄漏的猜測。

查看有關使用堆轉儲的VisualVM指南: 這是Oracle的

由於組件相同,因此您可能還會查找NetBeans引用,例如, 如何使用Netbeans Profiler查找內存泄漏?

您需要知道誰創建或保留對Byte[]Byte的引用。 攻擊的一種計划是檢查單個Byte[]實例(“實例視圖”)並查看它們的引用。 “最近的GC根目錄”選項將顯示保留持久Byte[]的對象的一個​​路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM