我一直在努力確定我所看到的是我的Debian Wheezy Mono-Sgen 2.10.8.1-8嵌入式應用程序中的內存泄漏。該系統有512MB的RAM。交換被禁用。我一直在研究嘗試瞭解Linux如何管理進程內存,以得出結論,我所看到的實際上是在Mono-Sgen某處的內存泄漏。我非常確定這不是我的應用程序,因爲我在經過數週的運行時間後已經多次對其進行了描述,並且GC內存始終回落到應用程序的基線。沒有任何物體從我的應用程序的角度泄漏。這並不意味着Mono-Sgen內部沒有泄漏,但我沒有確定這一點,而且可能不是。這是Linux Mono應用程序中的內存泄漏嗎?
我試圖限制我的Mono-Sgen堆,因爲對於大堆的單聲道的默認值是512MB,並且由於這是我所有的系統,因此我認爲我需要限制它以防止來自Linux的OOM。我對單雙SGEN配置如下:
出口MONO_GC_PARAMS =大= marksweep固定,主要堆大小= 32M,幼兒園尺寸= 4M,疏散閾值= 75
從我的理解我使用32MB固定大小的標記和清掃固定主堆,默認的4MB大小的苗圃大小,如果任何主要堆分配桶降到75%以下,以防止碎片,Mono-Sgen將在主堆上執行復制收集。我違約了66%。
自停電導致重置以來,我的設備目前已經運行了6天多一點。當我的應用程序首次啓動時,我等待大約10分鐘以確保它已完全初始化,然後快速啓動/ proc/PID/status文件以獲取其內存使用情況的基準。今天,我又搭了一家快餐店,看看我在哪裏,並且一如既往,我的虛擬,居民和Mono-Sgen流程實例的數據再次增長。它尚未破壞初始化期間發生的高水位標記,但上次我做了這個測試。我無法做到的以及我試圖完成的是讓它運行到耗盡系統所有物理內存的程度。我需要知道這是否實際上是內存泄漏,或者在某些時候,Linux將收回我的進程分配的一些頁面。
我注意到的一件事是,即使知道我沒有交換,我的Mono-Sgen進程的常駐大小總是比數據計數少大約30MB。根據我的理解,數據計數是堆分配的數量,常駐大小是物理內存中的實際大小,虛擬是已分配的內容,不一定使用。
我的假設是,Linux只是Linux,不會浪費時間或內存,除非必須。我假設由於系統負載很輕,Linux有0內存壓力來做任何事情來回收內存,只是爲了防止Mono-Sgen繼續分配和增長堆,我希望當有一些實際的內存壓力時,Linux將會介入並回收沒有真正使用的頁面。
我讀過Linux在先前分配的內存上調用free時不會縮小進程的已分配內存大小。我不明白爲什麼,除非Linux是Linux,否則它只會在需要時才這樣做。但我的恐懼是需要等待多久,直到發生這種情況。
這是內存泄漏還是內存壓力開始啓動時,Linux會回收此進程駐留和數據大小之間的頁面差異?我已經搜索並閱讀了所有關於該主題的手,並且我沒有找到我正在尋找的答案,並且真的不想等待一個月,以確定我的應用程序是否會因爲OOM殺手而反彈。我會無論如何:)但我想知道之前。
我用Mono-Sgen 2.10.8查看了潛在的內存泄漏。1-8,但是對於我正在做的事情(對本地Linux應用程序使用大量process.start()調用),會傷害到我的大多數類型的錯誤都不在此版本中。我嘗試更新Jessie的Mono-Sgen版本(我認爲是3.2.8),但它在我的系統上崩潰,所以我回到了穩定的Mono-Sgen 2.10.8.1-8版本,以避免更多的未知恐懼。
附加了許多典型內存信息的快照,大部分注意力集中在/ proc/PID/status返回的內容上。
任何信息都將不勝感激,我的希望是我不明白Linux如何在輕載系統上回收內存。
運行它的valgrind。你還沒有發佈任何足夠的信息來告訴我們。 – 2014-08-31 20:24:19
謝謝我會嘗試,我不確定它是否適用於armel。 – CCS 2014-09-02 05:08:59