总览
内存泄漏:内存被分配出去后 一直没有被释放,导致这部分内存无法被再次使用,更严重的是,指向这块内存空间的指针都不存在了,进而再也无法访问这块内存空间
场景:服务器中的后台任务持续运行,系统中可用内存越来越少; 应用程序正在运行时忽然被 OOM kill 掉了; 进程看起来没有消耗多少内存,但是系统内存就是不够用了
在遇到系统内存不足时,首先要做的是查看 /proc/meminfo 中哪些内存类型消耗较多,然后再去做针对性分析
泄漏的内存可能是应用程序的内存泄漏、内核(操作系统)的内存泄漏;
应用程序的内存泄漏可能是堆内存(heap)的泄漏,也可能是内存映射区 (Memory Mapping Region)的泄漏;
不同的内存类型都可以理解为是进程地址空间 (Address Space) 的一部分:
四种内存类型:从是不是文件映射, 以及是不是私有内存这两个不同的维度来做区分
1 私有匿名内存:进程的堆、栈,以及 mmap(MAP_ANON | MAP_PRIVATE) 这种方式申请的内存都属于这种类型的内存。其中栈是由操作系统来进行管理的,应用程序无需关注它的申请和释放;堆和私有匿名映射则是由应用程序(程序员)来进行管理的,它 们的申请和释放都是由应用程序来负责的,所以它们是容易产生内存泄漏的地方。
2 共享匿名内存:进程通过 mmap(MAP_ANON | MAP_SHARED) 这种方式来申请的内 存,比如说 tmpfs 和 shm。这个类型的内存也是由应用程序来进行管理的,所以也可能会发生内存泄漏
3 私有文件映射:进程通过 mmap(MAP_FILE | MAP_PRIVATE) 这种方式来申请的内存, 比如进程将共享库(Shared libraries)和可执行文件的代码段(Text Segment)映射到自己的地址空间就是通过这种方式。对于共享库和可执行文件的代码段的映射&