2015-06-19 27 views
5

語境bash的錯誤代碼137對1時出存儲器

我在linux bash中運行下面的命令:

mono --debug --debugger-agent=transport=dt_socket,address=198.178.155.198:10000 ./Stress.exe 

Stress.exe是C#應用程序。

會發生什麼

在一個點上的系統內存不足,這是通緝。返回錯誤代碼。

返回的錯誤代碼(回聲$?)

代碼1:當我的程序創建了一個罰球,因爲它是內存不足。

代碼137:當它超載內存時被操作系統殺死。

問題

爲什麼有時殺死我的應用程序的操作系統?爲什麼結果不總是一樣的? 「

+0

您使用Linux? –

+0

是!!我雖然bash總是linux? – Cher

+0

^^不,[[標籤:cygwin] ... – anishsane

回答

3

假設:

  • 單聲道運行SGEN基於GC
  • Linux的OOM殺手其實是啓用
  • 你Stress.exe只alloc'ing管理存儲即沒有本地interop,沒有使用marshaling內存分配器,沒有標記不安全的代碼等等。
  • 您正在不斷創建對象並從不釋放這些re FS。

讓我們談談SGEN,爲了分配對象,它們在託兒所中創建,當您在託兒所內耗盡內存時,GC執行掃描時必須進行託兒所收集,因爲它已滿,活的物體移動到它的主要堆。如果主要磁頭已滿,則需要更多的操作系統內存。您可以調整分配給單聲道應用程序的初始內存量,甚至修復Sgen可以使用的內存量(最大值)。還有超過8000字節的管理對象由Sgen的大對象空間管理器來處理,這是非nursery/major-heap的內存,但它仍然是託管對象/內存。

因此,通常當單聲道需要更多空間用於管理對象並且執行操作系統對附加塊的請求時,操作系統將顯示NO,您將看到OutOfMemory異常和0退出代碼。你的壓力測試很高興。

但是OOM正在觀察單聲道過程並將其分數調高(oom_score)越來越高。它可能在任何時候觸發單聲道進程,但是我認爲在SGEN暫停應用程序線程時,但在SGEN由於無法管理而實際執行操作系統內存請求之前進行GC掃描時,這是正確的存儲空間在nusery。因此你得到137的退出。137 = & 127 = 9,所以單聲道進程發送了一個SIGKILL信號(kill -9),你的壓力測試不開心。

嘗試這是一個實驗:

  • 1)如果完全關閉OOM殺手。假設這不是一個 現場製作箱,你正在強調;-)你應該在100%的時間內看到 「System.OutOfMemoryException」。
  • 或2)將oom_adj 的單聲道進程設置爲-17,OOM將使其獨立。只需 在shell腳本中包裝你的單聲道啓動,以抓取它的pid,並回應該進程的oom_adj -17 。 3)如果將單聲道進程的oom_adj調低(一直降低到-16,比你會看到單聲道捕捉它是自己的管理內存中斷'更多的時間',但它永遠不會是100%的時間...

這不是一個單聲道和/或Sgen/GC相關的'問題'。任何消耗越來越多內存的進程都會被OOM殺死。數據庫或只是一個應用程序/守護進程有內存泄漏,等等..他們都受到kill'd

+0

謝謝!!真的很清楚它爲什麼會發生,並且你的預測確實是正確的! – Cher

+0

太棒了!,很高興能幫到你。 – SushiHangover

相關問題