2012-07-06 39 views
1

我有一個在Solaris中運行的C++進程,它創建3個線程來完成一些任務。 這些線程在循環中執行,只要進程正在運行,它就會運行。一個進程的內存使用增加

但是,我發現進程的內存使用量持續增長,一旦內存使用超過4GB,進程內核就會轉儲。

有人可以給我一些關於什麼可能是內存使用增長背後的問題的指針? 我能做些什麼來防止由於內存耗盡而導致核心轉儲的過程?

線程重啓會有幫助嗎?

歡迎任何指針。

+1

看起來你有內存泄漏。嘗試Valgrind。 – chris 2012-07-06 06:02:55

+0

嘗試Purify。看不到任何泄漏 – cppcoder 2012-07-06 06:03:59

+0

我們需要更多的信息。你使用原始刪除和新的或RAII?如果你使用RAII,並且你有泄漏,那麼你有一個可怕的問題來調試,因爲你的泄漏可能是由競態條件引起的,而不是缺少刪除或刪除[]。 – NoSenseEtAl 2012-07-06 07:07:29

回答

4

不,重新啓動線程無濟於事。

看起來好像你的應用程序中有內存泄漏。

根據我的經驗,有兩種類型的內存泄漏:

  • 真正的內存泄漏,你可以看到,當應用程序退出
  • 「假」內存泄漏,就像一個大名單的一生中增加您的應用程序,但它是在最後正確清理

對於第一種類型,有工具可以報告你的應用程序退出時尚未釋放的內存。我不知道Solaris,但在Windows下有許多工具可以實現這一點。對於Unix,我認爲Valgrind會這樣做。

對於第二種類型,Windows下還有一些工具可以拍攝應用程序的內存快照。只需以幾分鐘或幾小時的時間間隔(取決於您的應用程序)拍攝兩張快照,並讓它們通過工具進行比較。在Solaris上可能有類似的工具。

使用這些工具可能需要您的應用程序佔用更多內存,因爲該工具需要存儲每個內存分配的調用堆棧。正因爲如此,它也會運行得更慢。但是,只有在使用此工具時纔會看到這種效果,因此在實際生產代碼中不會有任何影響。

所以,只需在Solaris下查找這種工具即可。我趕緊Google搜索,發現這個鏈接:http://prefetch.net/blog/index.php/2006/02/19/finding-memory-leaks-on-solaris-systems/。這可能是一個起點。

編輯:一些額外的信息:你在尋找正確的內存?即使您只總共分配了3GB,由於內存碎片,總虛擬地址空間仍可能會達到4GB。不幸的是,你無能爲力(除了使用另一種內存分配策略)。

+0

這些線程處理大量的內存分配。所以,如果我重新啓動線程,不會釋放內存,如果有泄漏存在?我正在使用'prstat'命令檢查內存 – cppcoder 2012-07-06 06:18:15

+2

不,只有在停止應用程序時纔會釋放內存。根據我在Internet上可以找到的信息(我自己不知道Solaris),PRSTAT的輸出顯示虛擬地址大小,它可能比您實際分配的數量多(由於分段)。谷歌的「私人字節和虛擬字節之間的差異」瞭解差異。谷歌的「防止內存碎片」找到方法來防止碎片(如果這是你的問題)。 – Patrick 2012-07-06 06:27:18

+0

@cppcoder:內存是由process_處理的,而不是_per線程。 – sbi 2012-07-06 09:55:44