优化内存最佳方法 (笔记本内存优化)

介绍

比较windows和linux的内存管理的区别

介绍应用程序对内存的一些知识

概念

地址空间

每一个32位进程都有4G的地址,其中2G内核空间,2G用户空间(linux 是1G内核,3G用户)。

这个地址空间实际是虚拟地址空间,需要通过内存映射到实际的物理内存地址

缺页异常

当进程访问的虚拟空间在页表中查询不到时,会触发缺页异常,然后进入内核空间进行分配物理空间、更新进程页表,返回用户空间,恢复进程运行。

交换分区(swap)

Swap其实就是把一块磁盘空间当作内存使用,windows xp/7 下也有专门的设置“虚拟内存”的功能。

只在物理内存不足时才需要使用磁盘作为交互区,但性能更加慢。

free 命令中buffer和cache的意义

[root@VM101124 ~]# free
              total        used        free      shared  buff/cache   available
Mem:        3880484      140028     3164964       17172      575492     3452908
Swap:       2097148           0     2097148
  • buffer:从磁盘读取数据的缓存
  • cache:从文件读取数据的页缓存

结论

从整体设计上,两者并没有明显的区别,该有的概念都有,虚拟内存、换页,该有的缓存也都有,内存管理器的设计方式也很相近,只是叫法上有所不同。

windows有保留空间、提交空间的概念,linux 虽然没这个概念,但是在内存malloc<128K时使用brk()申请空间时其实已经预留了所谓的保留空间。在重复调用malloc(n)字节时,除了第一次(或预留空间不足时)会调用brk申请空间,剩下的情况则不调用brk接口的。

同样的,在调用大内存时都采用了直接内存申请的方式:windows 在内存大于508K时,会调用virtualalloc直接申请大内存,而linux在大于128K时,直接调用mmap()直接使用内存映射来分配。

遇到的问题也是一样的:

  • 碎片
  • 泄漏
  • 默认内存分配器性能问题
  • 踩内存

解决方法

内存池

使用tcmalloc/jemalloc替换glibc默认的ptmalloc2.

ptmalloc2

  • 每次申请内存需要加锁
  • 通用性更好,对于任意内存大小申请,性能一致

tcmalloc

小内存:1~256K中等内存:256K~1M大内存:>1M

  • 无锁
  • 对于小内存(<256K)性能优异

工具

windows

  • processxp
  • windbg
  • umdh
  • application verifier(越界访问)

linux

  • free
  • gdb
  • vmstat
  • valgrind(越界访问)
  • memleak

案例分析

如何通过dump分析内存 - 待发布

如何分析踩内存 - 待发布

参考文章

Hack the Virtual Memory