我们编写了一个非常简单的C ++程序来隔离错误。应用程序将一个数字作为参数并创建该数量的线程并将所有这些线程发送到事件循环中。如果我们使用> 3个线程(包括主线程)运行应用程序,则顶部显示它在虚拟内存中占用100 + MB。但是,如果我们使用< = 3个线程运行它,它将以大约36MB的虚拟内存运行。我们strace
了解应用,发现在第一个方案中,有一个大约65MB的mmap
匿名映射但未映射。问题是随着线程数量的增加,内存使用率会上升。而且我们有大量具有大量线程的二进制文件,因此似乎有很多浪费的空间。为什么会这样? SLES11 64位。
答案 0 :(得分:5)
默认情况下,每个线程都会获得大约8Mb的堆栈。您可以在使用pthread_attr_setstacksize创建线程时设置默认值。确保您始终:pthread_join()'已结束的线程。要么;将它们创建为分离的线程,否则在线程结束时会泄漏内存。
拥有大量的虚拟记忆用法通常不是问题,除非你真的在使用所有空间,它只是虚拟内存 - 你几乎不会在64位机器上耗尽。