通常我们认为一旦内存写溢出,程序就很容易崩溃.所以服务器上通常会对一些重要进程做脚本保护,一旦崩溃立即重新拉起. 最近发现我们一个公共服务内存写溢出时程序没有崩溃,而是卡死了. 为了深入分析原因,我们仔细review了glibc的代码,并发现一个较为隐蔽的bug.     先来看这个卡死的程序堆栈(64位环境,下同): 可以看到在free函数中使用了锁. 那么再来看看glibc中free函数的主要代码: 这段代码相当简单,不用过多解释. 再对比上面的堆栈,可以推测流程大概是这样的:frame 9…
http://hi.baidu.com/taobaoshoping/item/07410c4b6d6d9d0d6dc2f084 在应用程序中,往往为了释放内存等,使用一些函数,其实,对于内存操作函数要谨慎使用,比如大家常常想到的 SetProcessWorkingSetSize,其实对于windows来说,系统会自动在程序闲置时(如程序被最小化)释放内存的,自己用内存释放 时,往往会造成一些莫名的内存错误,造成自己的应用程序及系统不稳定. 具体原理有人已经写得很清楚了,以下为转帖的几个帖子,供参…
C语言有两种内存申请方式: 1.静态申请:当你声明全局或静态变量的时候,会用到静态申请内存.静态申请的内存有固定的空间大小.空间只在程序开始的时候申请一次,并且不再释放(除非程序结束). 2.自动申请:当你声明自动变量的时候会使用自动申请.函数参数.局部变量都属于自动变量.这些变量空间在程序执行致相关语句块申请,离开语句块时释放. 还有一种内存申请方式:动态内存申请.C语言变量并不支持动态内存申请,这一功能由库函数实现.C里面没有动态这个存储类型!! 当你需要存储一些数据,但又不知道这些数据有多…
本文转载自glibc内存管理那些事儿 Linux内存空间简介 32位Linux平台下进程虚拟地址空间分布如下图: 进程虚拟地址空间分布 图中,0xC0000000开始的最高1G空间是内核地址空间,剩下3G空间是用户态空间.用户态空间从上到下依次为stack栈(向下增长).mmap(匿名文件映射区).Heap堆(向上增长).bss数据段.数据段.只读代码段. 其中,Heap区是程序的动态内存区,同时也是C++内存泄漏的温床.malloc.free均发生在这个区域.本文将简单介绍下glibc在动态内…
这个问题折腾了我整整一天. 有一个线程管理类,集中管理所有新建的线程, 线程统一在创建时标识 FreeOnTerminate 为 True. 因为有的线程是不限次循环的,所以在管理类最后 Destroy 时必须对这些线程进行手工停止并释放. 开始代码: FAllThread.Items[i].FOwner := nil; //释放时不必再消息通知管理类删除记录 FAllThread.Items[i].Terminate; 发现 FastMM检测有内存泄露,想了下因为线程还没结束,但主进程结束了,…
最近开发一个私人程序时碰到了严重的内存问题,具体表现为:进程占用的内存会随着访问高峰不断上升,直到发生OOM被kill为止.我们使用valgrind等工具进行检查发现程序并无内存泄露,经过仔细调查我们发现时glibc的内存管理机制导致的,下次将发文对此深入解释,本文只列出核心的几个要素: 1. glibc在多线程内存分配的场景下为了减少lock contention,会new出很多arena出来,每个线程都有自己默认的arena,但是内存申请时如果默认arena被占用,则round-robin到…
最近做一个公司的业务系统,公司要求能尽可能的与c/s近似,也就是如c/s一样,点击文本框可以弹出此项目的相关内容,进行选择输入.     我使用了弹出窗口,然后在子窗口双击选中项目,把选中的值返回给父窗体.     在系统做完了之后,在客户使用的过程,由于客户使用的是512m的内存配置,所以在打开了30--40个窗体之后,ie的虚拟内存占用量达到近200m,从而使系统变慢,javascript的运行也变慢了. 在google搜了一下之后,才知道可能是由于ie的内存泄漏引起的.具体可以参看中的相关…
一个内存释放的实例 <SCRIPT LANGUAGE="JavaScript"><!--strTest = "1";for ( var i = 0; i < 25; i ++ ){ strTest += strTest;}alert(strTest);delete strTest;CollectGarbage();//--></SCRIPT> CollectGarbage,是IE的一个特有属性,用于释放内存的使用方法嘛应该是…
目录 分箱式内存管理 Unsorted bin Fast bins 核心结构体分析 malloc_state 内容来源 分箱式内存管理 Unsorted bin   Unsorted bin 可以看作是 small bins 和 large bins 的 cache,只有一个 unsorted bin,以双向链表管理空闲 chunk,空闲 chunk 不排序,所有的 chunk 在回收时都要先放到 unsorted bin 中,分配时,如果在 unsorted bin 中没有合适的 chunk,…
目录 Ptmalloc内存管理设计 Main_arena 与 non_main_arena chunk 的组织 空闲 chunk 容器 sbrk 与 mmap 内存分配概述 内存回收概述 边界标记法 内容来源 Ptmalloc内存管理设计 具有长生命周期的大内存分配使用 mmap. 特别大的内存分配总是使用 mmap. 具有短生命周期的内存分配使用 brk,因为用 mmap 映射匿名页,当发生缺页异常时,linux 内核为缺页分配一个新物理页,并将该物理页清 0,一个 mmap 的内存块需要映射…