简单介绍apahce内存管理机制

 
     我们知道在C中,内存的分配和释放都是通过mallloc和free进行的,而对同一块内存的多次释放通常会导致页面错误,而一直不释放又导致内存泄露。为了在大而且复杂的Apache中避免内在的内存管理问题,Apache的开发者创建了一套基于池概念的内存管理方案。
 
     在这套方案中,核心概念是的概念。Apache内存分配的基本结构都是资源池,包括线程池,套接字池等等。内存池通常是一块很大的内存空间,一次性被分配成功,然后需要的时候直接去池中取,而不需要重新分配,这样避免的频繁的malloc操作,另一方面,即使内存的使用者忘记释放内存,这些内存也不会丢失,它们仍然在内存池中,当内存池被销毁的时候这些内存将自动的被销毁。
 
     Apache的内存池并不只有一个内存池,而是存在多个内存池,这些内存池之间形成层次结构。如果Apache中仅仅存在一个内存池的话,潜在的问题是所有的内存分配都来自这个池,而且这些内存必须在整个Apache关闭时候才被释放(根内存池在整个Apache运行期间都存在),这一点显然不是那么合情合理,为此Apache中根据处理阶段的周期长短又引出了子内存池的概念,与之对应的是父内存池以及根内存池的概念,它们的唯一区别就是存在的周期的不同而已。
     
     比如对于HTTP连接而言,包括两种内存池:连接内存池和请求内存池。由于一个连接可能包含多个请求,因此连接的生存周期总是比一个请求的周期长,为此连接处理中所需要的内存则从连接内存池中分配,而请求则从请求内存池中分配。而一个请求处理完毕后请求内存池被释放,一个连接处理后连接内存池被释放。
 
     明白了Apache的内存池的概念,我们再来回顾一下前面文章里的相关内容(对象内存分配  静态变量和静态方法的生命周期),这样我们可以认为:对象的方法和属性是在对象内存池中申请内存,而该对象的静态方法和属性则是在请求的内存池中申请内存,静态方法的生存周期比对象的生存周期要长。

posted on 2008-12-21 14:53  eoiioe  阅读(1412)  评论(0编辑  收藏  举报

导航