内存优化的那些事【C/C++】

1.避免没有必要的缺页中断

用new或者malloc申请内存时,系统并不会立刻分配相应内存,而是在实际使用时才这片内存时才分配。所以为了避免没有必要的缺页中断,可以在申请内存后,立刻初始化一遍内存,避免进程处理业务时产生终端。


使用mlock锁定内存,避免被交换出去。

 

尽量减少swap或把swap关掉。

http://blog.csdn.net/b2222505/article/details/60324150

http://blog.csdn.net/b2222505/article/details/54144353




2.减少页表映射

如果物理内存很大,映射表的条目将会非常多,会产生较多TLB Miss,内存访问过程很耗时。例如程序需要访问4MB的内存,那么就需要1024个页面,TLB需要1024个表项,同时需要1024个页表项,系统至少需要产生1024次TLB中断,才可以把4MB内存映射到物理内存。


通常情况下对于大块内存的频繁访问,可以采用大页表减少页表条目,提高内存查询速度

cat /proc/meminfo|grep "HugePages"可以查看大页表的状态

 

减少了内存页表项的缓存压力和CPU cache缓存内存地质映射的压力,提高了寻址能力和内存管理效率。大页内存还有其他一些使用时需要注意的地方:

大页内存不能交换(SWAP).

使用不当时可能造成更大的内存泄漏。




3.避免伪共享

多核CPU,每个核都拥有独立的L1/L2的缓存,而缓存按照最小单位缓存行进行和内存交互,缓存行一般为64字节。

当多线程修改互相独立的变量(一般出现在全局变量或者一些动态申请的内存)时,如果这些变量共享同一个缓存行,那么当某个核修改缓存行某个变量值时,需要锁定缓存行,同时其他核已经加载该缓存行的cache也跟着失效,需要重新从内存读取。




4、内存池,减少频繁申请、释放内存

 



http://blog.csdn.net/b2222505/article/details/72615009


内存优化的那些事【C/C++】_第1张图片


你可能感兴趣的:(C++,linux系统)