频繁分配释放内存导致的性能问题的分析

刚才看了百度同学的分享,觉得挺有意思。试着总结一下:

征兆:

1. system cpu占用率偏高。

2. 执行命令 用ps -o majflt,minflt -C program命令查看,majflt或者minflt每秒增量很大。

 

原因:

频繁的分配释放内存,导致缺页中断次数很高。而缺页中断的处理是由系统在内核态完成的,所以system cpu利用率偏高,导致性能问题的产生。

 

解决办法:

将动态内存改为静态分配,或者启动的时候,用malloc为每个线程分配,然后保存在threaddata里面。但是,由于这个模块的特殊性,静态分配,或者启动时候分配都不可行。另外,Linux下默认栈的大小限制是10M,如果在栈上分配几M的内存,有风险。 
禁止malloc调用mmap分配内存,禁止内存紧缩。
在进程启动时候,加入以下两行代码:
mallopt(M_MMAP_MAX, 0); // 禁止malloc调用mmap分配内存
mallopt(M_TRIM_THRESHOLD, -1); // 禁止内存紧缩

 

注意:

1. Linux内存分配,在超过128K时,就会调用mmap,而不是移动brk指针。当munmap时,会把内存释放掉。

2. 释放掉的内存数大于128K时,会调用brk紧缩逻辑。

以上两点都会把内存释放掉,导致下次申请内存时还会产生缺页中断。

 

原帖地址:http://topic.csdn.net/u/20100325/16/0b86c0ed-5b8d-4eec-a757-c782ae9a3a35.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值