内存不足而没有OutOfMemoryError
這實際上是最初發布于2010年的帖子的轉世。 昨天,當聽到我們的工程師咒罵一個特別令人討厭的錯誤時,閃回發生了。 當詛咒停止時,我走過去核實我的懷疑。 瞧,我是正確的–情緒波動是由應用程序用盡了堆空間導致的,但死于沒有通常的OutOfMemoryError癥狀。
因此,讓我通過三年前我第一次遇到的相同代碼示例來說明缺少OutOfMemoryError的情況。 那時我使用的是Windows XP,安裝了2010年中期的JDK 6。
我在玩的是Plumbr的早期發行版,該發行版應該是從應用程序中發現內存泄漏的。(編輯:那時,它除了崩潰JDK之外幾乎沒有做任何事情)。 為了驗證這一點,我寫了一個小片段,我認為這對于泄漏發現是一個很好的測試用例(編輯:實際上不是)。 我能夠創建并啟動以下命令:
class Leak { static List list = new ArrayList(); public static void main(String[] args) { for (int i = 0; i >= 0 ;i++) { list.add(i); } System.out.println("I will either reach here or die trying"); } }對于marketoid來說相當不錯,是嗎? 但是您認為運行顯示在我的命令提示符下的代碼是什么:
選項A:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:2760)at java.util.Arrays.copyOf(Arrays.java:2734)at java.util.ArrayList.ensureCapacity(ArrayList.java:167)at java.util.ArrayList.add(ArrayList.java:351)at Leak.main(Leak.java:6)選項B:
I will either reach here or die trying好吧,正如我發現的那樣,它什么都不會打印出來,所以我幾乎只能盯著空的命令提示符。
由于距離我上一次真正的Java開發經驗只有兩年,之后才被降級為管理人員,所以我沒有時間進行故障排除。 因此,我將樣本帶給了鐵桿Java黑客,這些黑客后來被稱為Zeroturnaround的創始人。 在過去的十分鐘中,我設法使它們看上去也眼花azz亂,在它出現之前-內存的分配方式使得沒有空間可以創建new OutOfMemoryError() 。
如果使用2010年中的JDK版本在Windows XP上以64MB堆(默認)執行上述操作,則會看到無提示失敗:
C:\work\snippets\leak java -Xmx64m Leak C:\work\snippets\leak但是,如果您稍微增加(實際上可以修改)堆大小,則會遇到更熟悉的情況:
C:\work\snippets\leak java -Xmx65m Leak Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:2760)at java.util.Arrays.copyOf(Arrays.java:2734)at java.util.ArrayList.ensureCapacity(ArrayList.java:167)at java.util.ArrayList.add(ArrayList.java:351)at Leak.main(Leak.java:6) C:\work\snippets\leak故事的道德啟示? 我只能建議升級到一個更現代的版本–不管我嘗試了哪種配置,我都無法使用今天在Mac上擁有的JDK 7版本來重新創建這種情況。 但是,查看有關流行的Java運行時配置的統計信息,您會發現可追溯到2010年之前版本的JDK部署數量驚人,這意味著問題仍然存在,迫使開發人員瘋狂地通宵達旦,試圖找出源代碼。這個問題沒有來自堆棧跟蹤的任何提示來支持它們。
無論如何,以我對JDK 6內部的廣泛知識支持工程團隊,我繼續前進,并從我曾經貢獻過的被人們遺忘的博客中恢復了這篇帖子。
翻譯自: https://www.javacodegeeks.com/2013/10/running-out-of-memory-without-the-outofmemoryerror.html
總結
以上是生活随笔為你收集整理的内存不足而没有OutOfMemoryError的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用BlockingExecutor限制任
- 下一篇: svmsung电脑怎么开(svmsung