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