Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
减少Linux中的每线程内存 我有一个C++应用程序,它可以创建大量的线程。使用ulimit-v unlimited,应用程序在创建1080个线程后会因segfault崩溃。当我试图访问用“new”分配的内存时,会发生崩溃。“new”返回非空指针,但对它的访问会发出segfault。 使用ulimit-v500000,应用程序不会崩溃,但限制了线程的最大数量(pthread_create失败-更好的行为)。 根据top,当总内存达到物理RAM的大小时,应用程序崩溃(ulimit-v unlimited)。 我需要约1500个线程(我知道缺点…) 根据valgrind的说法,线程非常小,每个线程使用约16kb的堆栈,所以我不知道为什么应用程序会占用这么多内存。 我可以更改/检查什么以减少每线程内存?ulimit-s 1024没有帮助。_C++_Linux_Multithreading_Memory - Fatal编程技术网

减少Linux中的每线程内存 我有一个C++应用程序,它可以创建大量的线程。使用ulimit-v unlimited,应用程序在创建1080个线程后会因segfault崩溃。当我试图访问用“new”分配的内存时,会发生崩溃。“new”返回非空指针,但对它的访问会发出segfault。 使用ulimit-v500000,应用程序不会崩溃,但限制了线程的最大数量(pthread_create失败-更好的行为)。 根据top,当总内存达到物理RAM的大小时,应用程序崩溃(ulimit-v unlimited)。 我需要约1500个线程(我知道缺点…) 根据valgrind的说法,线程非常小,每个线程使用约16kb的堆栈,所以我不知道为什么应用程序会占用这么多内存。 我可以更改/检查什么以减少每线程内存?ulimit-s 1024没有帮助。

减少Linux中的每线程内存 我有一个C++应用程序,它可以创建大量的线程。使用ulimit-v unlimited,应用程序在创建1080个线程后会因segfault崩溃。当我试图访问用“new”分配的内存时,会发生崩溃。“new”返回非空指针,但对它的访问会发出segfault。 使用ulimit-v500000,应用程序不会崩溃,但限制了线程的最大数量(pthread_create失败-更好的行为)。 根据top,当总内存达到物理RAM的大小时,应用程序崩溃(ulimit-v unlimited)。 我需要约1500个线程(我知道缺点…) 根据valgrind的说法,线程非常小,每个线程使用约16kb的堆栈,所以我不知道为什么应用程序会占用这么多内存。 我可以更改/检查什么以减少每线程内存?ulimit-s 1024没有帮助。,c++,linux,multithreading,memory,C++,Linux,Multithreading,Memory,新的返回非空指针但在访问该内存时崩溃的问题是Linux内存过度使用“功能”: 默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,无法保证内存确实可用。如果系统内存不足,OOM杀手将杀死一个或多个进程。有关更多信息,请参阅proc(5)中的/proc/sys/vm/overmit_memory和/proc/sys/vm/oom_adj的描述,以及Linux内核源文件文档/vm/overmit accounting : 在Linux/x86-32上,新线程的

新的
返回非空指针但在访问该内存时崩溃的问题是Linux内存过度使用“功能”:

默认情况下,Linux遵循乐观的内存分配策略。这意味着当
malloc()
返回非NULL时,无法保证内存确实可用。如果系统内存不足,OOM杀手将杀死一个或多个进程。有关更多信息,请参阅
proc(5)
中的
/proc/sys/vm/overmit_memory
/proc/sys/vm/oom_adj
的描述,以及Linux内核源文件
文档/vm/overmit accounting


:

在Linux/x86-32上,新线程的默认堆栈大小为2 MB。在NPTL线程实现下,如果程序启动时的
RLIMIT_堆栈
soft resource limit具有“unlimited”以外的任何值,则它将确定新线程的默认堆栈大小。使用
pthread\u attr\u setstacksize(3)
,可以在用于创建线程的attr参数中显式设置堆栈大小属性,以获得默认值以外的堆栈大小


您可以使用
valgrind
massif
工具来检查内存的用途。拥有1080个线程似乎也毫无意义。我已经有一段时间没有使用valgrind了,但是请注意,堆栈使用的内存量不一定与为堆栈保留的内存量相同。