在程序设计中,创建物体模块主要是通过生成对象来实现。当对象使用结束后,则会成为不再需要的模块进行销毁。
而在系统进行对象的生成与销毁过程中会大量的增加内存的消耗,同时对象的销毁往往会留下残留的信息,这样将会伴随内存泄露的问题存在。
在实际的程序开发过程中,往往需要生成和销毁大量重复的对象,这就使得内存泄漏产生的信息过多而无法被系统回收,从而占用系统更多的内存,而且生成物体过多时无法确定被什么模块实例化实现,对系统造成负担,不利于管理及后续操作,长此以往最终将导致程序变慢甚至崩溃。
对象池是存放了一批已经创建好的对象的池,它是一个用来维护对象的结构。当程序需要使用对象的时候,可以直接从池中获取该对象,而不是实例化一个新的对象。
在程序设计过程中,大部分人关注的往往只是对象的使用和效果的实现,实际上创建和使用之间还有一个初始化的过程,不过系统会将初始化和创建这两步结合在了一起,这样使得设计者忽略了系统创建和销毁对象这一过程对系统的影响。
通常来讲,一个对象的创建和销毁过程开销很小,可以忽略不计,但是如果一个程序中涉及到一种对象多次创建,并且创建时间比较长,那就会能很明显的感觉到这部分的消耗所造成的系统速度受限。
对象池可以看作是减少 GC 压力的首选方法,同时也是最简单的方法。
对象池模式主要适用于以下应用场景:
- 资源受限的场景。比如,不需要可伸缩性的环境(CPU、内存等物理资源有限),CPU性能不够强劲,内存比较紧张,垃圾收集,内存抖动会造成比较大的影响,需要提高内存管理效率, 响应性比吞吐量更为重要。
- 在内存中数量受限的对象。
- 创建成本高的对象。
- 大量的存活期短且初始化成本低的对象池化,以降低内存分配和再分配成本,避免内存碎片。
- Python 的这样的动态语言,GC 是依靠引用技术来来保证对象不会过早的回收,某些场景下可能出现虽然创建了但是没人使用的空闲期,导致对象被回收了。可以委托给对象池来保管。
- IT问答库http://www.mobiletrain.org/qa/