我有一個創建大量線程的C++應用程序。使用ulimit -v unlimited,創建1080個線程後,應用程序崩潰併發生segfault。當我嘗試訪問分配有「新」的內存時發生崩潰。 「new」返回非空指針,但訪問它會發出段錯誤。 使用ulimit -v 500000,應用程序不會崩潰,但會限制最大線程數(pthread_create失敗 - 行爲要好得多)。 根據上圖,當總內存達到物理RAM的大小時,應用程序崩潰(ulimit -v unlimited)。 我需要~1500個線程(我知道這個缺點......) 根據valgrind的說法,線程非常小,每個線程使用〜16kb的堆棧,所以我不知道爲什麼這麼多的內存被應用佔用。 我可以更改/檢查以減少每線程內存? ulimit -s 1024不起作用。在Linux中減少每個線程的內存
1
A
回答
3
new
返回一個非空指針,但在訪問該內存時崩潰的問題是Linux內存過量使用「功能」。 man malloc
:
默認情況下,Linux遵循樂觀的內存分配策略。這意味着當
malloc()
返回非NULL時,不能保證內存真的可用。如果事實證明系統內存不足,OOM殺手會殺死一個或多個進程。有關更多信息,請參閱/proc/sys/vm/overcommit_memory
和/proc/sys/vm/oom_adj
的描述,以及proc(5)
以及Linux內核源文件Documentation/vm/overcommit-accounting
。
在Linux/X86-32,對於一個新的線程默認堆棧大小爲2兆字節。在NPTL線程實現下,如果
RLIMIT_STACK
軟件資源限制在程序啓動時具有「unlimited」以外的任何值,則它確定新線程的默認堆棧大小。使用pthread_attr_setstacksize(3)
,可以在用於創建線程的attr參數中顯式設置堆棧大小屬性,以便獲取非默認值的堆棧大小。
相關問題
- 1. 減少內存
- 2. 在iOS中減少NSString的內存?
- 3. 減少Java進程的內存
- 4. 如何用ramdisk減少嵌入式linux中的'Cached'內存
- 5. 我該如何刻意減少Linux中的空閒內存量?
- 6. 儘量減少Tomcat「每個連接」的內存佔用量
- 7. GHC中每個線程的線程內存訪問限制
- 8. 每個線程使用的內存量
- 9. 在Linux上使用共享庫來減少內存負載
- 10. 如何通過python線程減少內存消耗
- 11. 減少CUDA parallization中的內存命中
- 12. 減少應用程序內存佔用
- 13. 在PhoneGap中減少應用程序的內存使用
- 14. 減少coreplot中的內存使用量
- 15. Hadoop減少內存中的shuffle合併
- 16. 減少內存中的圖像大小
- 17. 減少Spree中的內存使用量
- 18. 在Perl中使用多線程時如何減少內存消耗?
- 19. 減少內存消耗
- 20. 減少內存流量
- 21. jQAssistant - 減少內存消耗
- 22. 減少內存佔用
- 23. 減少內存使用量
- 24. 減少內存泄漏Android
- 25. 如何減少內存:
- 26. 減少內存使用量
- 27. Unix/Linux線程的默認內存塊?
- 28. 減少一個Haskell程序的內存佔用
- 29. 減少Solaris上多個Java進程的內存佔用(UNIX)
- 30. 每線程內存管理在C#
您可以使用'valgrind'和'massif'工具來檢查內存的用途。也有1080線程似乎沒有意義。 – VTT
我沒有使用valgrind一段時間,但請注意堆棧的_used_內存量不一定與堆棧的_reserved_的內存量相同。 –