簡體   English   中英

從 JVM 內存不足異常中恢復並在可能的情況下重置 JVM

[英]Recovering from Out of Memory Exception within the JVM and reset JVM if possible

我正在創建一個測試套件來為我的團隊正在開發的應用程序運行功能測試。 功能測試是由個別開發人員編寫的,我觀察到一些測試用例由於各種原因拋出 OutOfMemoryError。 這種情況會間歇性地發生。

為了處理這種情況,我想在我的測試套件中捕獲 OutOfMemoryError。 我希望捕獲這個錯誤能讓我運行后續的測試用例,而不必一起退出應用程序。 但是我看到一個帖子說垃圾收集完成后會拋出內存不足錯誤。 在這種情況下,我可以在 OutOfMemoryError 的 catch 塊中做一些事情來清理/重新啟動 JVM,然后繼續執行嗎?


    Map<String, String> testcaseStatuses = new HashMap<String, String>();
    String testcaseStatus = "FAIL";
    for(Testcase testcase : testcases)
    {
        try
        {
            runTestcase(testcase);
            testcaseStatus = "SUCCESS";
        }
        catch(OutOfMemoryError e)
        {
            logError(e);
            testcaseStatus = "SYSTEM_ERROR";
                        // Do something creative to re-initialize JVM
        }
        catch (Exception e)
        {
            logError("Testcase failed with exception : " + e);
        }
        finally
        {
            testcaseStatuses.put(testcase.getName(), testcaseStatus);
        }
    }

    // Do something with testcaseStatuses   

如果第一個失敗,我不想停止運行剩余的測試用例。 這是可行的嗎?

注意:我確實在 SO 上遇到過幾篇關於使用的帖子

-XX:OnOutOfMemoryError="New script to run"

這是我目前正在考慮的事情。 但是為了遵循這條路徑,我必須重新設計我執行測試用例的整個方式,如果可以的話,我想避免這些方式。

提前致謝。

從內存不足的 JVM 內部是不可能的。

當然,理論上您應該修復那些 OutOfMemoryErrors 的原因,或者確保負責的人修復它們。 但是,考慮到您所處的現實生活場景,我建議重新設計您的測試應用程序以將每個測試封裝在其自己的 JVM 中,例如:

  • 創建一個可以執行測試的應用程序,但一次只能執行一個,由運行時參數選擇。

  • 創建一個應用程序,在單獨的進程中運行前一個應用程序,每次測試一次。 然后使用控制台輸出、記錄數據和/或進程返回值來確定測試的狀態,包括它是否耗盡內存。

暫無
暫無

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

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