1 netty内存池概述
内存管理,按使用的范围,分为操作系统的内存管理和用户应用自己的内存管理。操作系统的内存管理是指,进程在需要时向操作系统申请分配一定量的内存资源,并在使用结束后释放和回收内存资源。常见的操作系统内存管理算法有:slab、buddy、jemalloc等经典算法。
而有些应用为了更有效地使用内存,自己借鉴操作系统的内存管理算法,实现了自己进程内的内存管理,比如netty(这里是指使用了netty的JVM进程)。基本做法是,先向操作系统申请一块较大的内存,然后自己再按使用需求在这块内存上进行分配和释放。
netty引入内存池技术,就是为了更有效地使用内存,概括起来主要包括以下几个目的:
1、更快速地分配和释放内存。因为netty是直接内存的重度用户,而直接内存的分配和回收,都涉及到系统调用,这是很慢的。如果将申请到的内存缓存起来,下次使用时直接从内存池分配,就快多了。
2、减少内存碎片。netty几乎完全借鉴了jemalloc内存分配算法,对内存外碎片和内碎片都有很好的控制。
3、使用合理的数据结构来记录内存块的分配状态(比如哪些已分配、哪些未分配以及未分配的内存在哪里),使得这些元数据消耗的内存尽量少。
4、使得应用所占用的内存页尽量少,避免发生过多的page fault,从而导致频繁换页,降低性能。
5、netty对内存使用量进行了跟踪监控,能更好地了解内存的使用情况。同时提供了内存泄露监控的机制。
2 netty内存池内存分配算法概述
netty内存池的内存分配技术,完全借鉴了jemalloc算法,只在细微之处有所差别。所以后面我们直接按netty源码来讲解,而jemalloc本身,可以参考:jemalloc论文和facebook的文章