Re: [翻譯] 死法無法預測

看板java作者 (Zzz...)時間11年前 (2014/04/26 05:34), 11年前編輯推噓1(102)
留言3則, 1人參與, 最新討論串2/4 (看更多)
※ 引述《PsMonkey (痞子軍團團長)》之銘言: : 在花了一天對付另一個 [Heisenbug]:每當我快抓到原因,它就會變了樣; 閒聊瞎扯一下 :> 前幾個月正好處理過一個類似的情形: 一個 multithreaded 的 .NET 程式不定時的 炸 OOM exception 對付陳宮,只能用箭;對付 Heisenbug, 除了 process dump analysis 外 大概沒什麼好辦法 參考 * http://blogs.msdn.com/b/dotnet/archive/2009/10/15/automatically-capturing-a-dump-when-a-process-crashes.aspx * http://blogs.msdn.com/b/pranavwagh/archive/2009/06/09/how-to-take-the-dump-for-a-process-which-crashes-randomly.aspx * http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx * http://stackoverflow.com/questions/1134048/generating-net-crash-dumps-automatically * google jvm crash dump 通常來說, OOM 算是好解的問題,因為 OOM 多半來自 memory leak + loop 是故 heap 裡多半會散佈著大量相似的物件, 只要能辨認這些物件 通常反推回程式碼裡的問題點就沒那麼難 然而,有另一型的 OOM, 很久之前有稍微提過, 是屬於 architectural 的問題, 就很難解 :( 因為 OutOfMemory 有時指的不是「記憶體的量不夠」 而是「沒有連續夠大塊的記憶體」 該案例裡,就是大量地創造、釋放大型物件 ( 大型物件會取在 .NET gen 2 heap ) 上 使得 gen 2 heap 的「連續可用空間」變得支離破碎, 而「可用空間總量」看起來還剩很多 打個比方,就像一立方公尺的木條跟一立方公尺的木屑都是一立方公尺的木料 但後者沒辦法拿來蓋房子; 在這種情形下,不管是 .NET 還是 Java, 都只會炸 OOM, 不知道為什麼不能設計成改炸 OutOfContinuousMemory 這種的... 最近幾期的 MSDN 雜誌裡提到最新的 .NET GC 應該可以避免 fragmentation 發生 不知道最新的 Java 8 在這方面有沒有相對應的改進 這種 OOM 就很難解…最快的解法就是裝傻... :D 總結: 寫 server 程式時,若能把該平台上的 debug 工具摸熟,常會有意想不到的妙用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 75.177.186.231 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1398461671.A.3B5.html ※ 編輯: AmosYang (75.177.186.231), 04/26/2014 05:40:07

04/26 17:09, , 1F
Fragmentation在Android上還滿容易監測的就是
04/26 17:09, 1F

04/26 19:12, , 2F
因為android的演算法相對簡單 看到heap/free比例不對
04/26 19:12, 2F

04/26 19:13, , 3F
大概要猜也猜得出來發生什麼事情了(摸下巴)
04/26 19:13, 3F
我對 Android 不熟, 能否就「看到heap/free比例不對」多說一些? 感覺是個蠻有意思的方向, 感謝 orz 編輯改個 typo ※ 編輯: AmosYang (75.177.186.231), 04/26/2014 20:59:22
文章代碼(AID): #1JMjJdEr (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 2 之 4 篇):
文章代碼(AID): #1JMjJdEr (java)