背景
近日在做一个嵌入式项目,linux平台,发现应用的程序的内存占用很大,经过同事的一起排查,发现系统的线程使用过多,导致应用程序的内存使用急剧增加。
那么线程使用过多为什么会导致内存的占用增加呢,现在我们一起来分析下。
分析
我们每次开辟一个线程,系统会为这个线程分配一系列的资源,包括堆、栈和寄存器等资源。
若我们创建线程的时候,如果不指定栈的大小,那么系统会默认为线程指定栈大小,这个栈大小默认是8M,可以用ulimit -a查看
栈主要存放一些局部变量及函数调用时的地址,只要我们在线程运行的过程中,没有开辟过大的局部变量,那么线程使用就没有问题,
但是如果我们使用了的局部变量的空间大于系统的默认8M,那么应用程序会崩溃。
所以对于一些线程,如果不需要用到那么大的栈大小,我们是可以在创建线程的时候更改其栈大小。
下面代码将线程栈大小改为4M
size_t s_stack_size = 4 * 1024 * 1024;//4M
pthread_attr_t attr; // 线程属性结构体变量
s32_ret= pthread_attr_init(&attr); // 初始化线程属性
if(s32_ret != 0) {
return;
}else {
s32_ret = pthread_attr_setstacksize(&attr, s_stack_size);//设置线程堆栈大小
if(s32_ret != 0) {
return;
}
s32_ret = pthread_create(p_thread_id, &attr, p_start_rtn, p_arg);
if(s32_ret < 0) {
return;
}
s_stack_size = 0;
pthread_attr_getstacksize(&attr, &s_stack_size);//获取线程堆栈大小
pthread_attr_destroy(&attr);
}