【知识总结】关于内存管理
2011-05-30 23:12 GUO Xingwang 阅读(689) 评论(0) 编辑 收藏 举报
1.VM管理
一般操作系统的用的都是基于VM的内存管理,这样可以扩展有效的物理内存,热点数据在物理内存中,非热点数据会进去页面文件后等后备存储中,需要时中断取出,对于系统或应用来说这一机制是透明的。
目前有些性能较好的缓存应用也在使用VM进行内存管理,例如redis,真正没有测试过,据说性能提升明显,从理论上说,缓存的热点数据和非热点数据应该分别对待,这种机制还是可取的。
2.内存池
这里所说的内存池就是指一些应用上程序上的内存池,例如c语言开发的程序一般会有专门的内存池来管理内存,例如nignx的内存池。内存池存在的意义主要在于减少频繁的分配和释放内存(一般是操作系统的VM内存管理中保留和归还操作),这一部分相对于IO来说消耗比较少,但是对于内存的频繁使用消耗就会比较明显。还有就是可以减少内存泄漏和内存碎片的产生。
3.GC管理
一些很高级的语言提供了GC管理的机制,例如C#或Java等,其实GC本身就是一个大的内存池,托管堆就是GC管理的对象,只不过这个内存池来说比较高级而已,算法比较适合于业务语言的需求。其实C#使用特殊的函数完全可以从非托管堆上分配内存,也可以实现一个高性能的内存池,这样GC的压力就会降下来,当然这都是对于大量而且频繁的内存使用而言,否则完全没有必要。
4.对象池
对于一些使用C#或Java开发的应用来说,如果面临着同一种类型的大量对象的new操作,而且马上使用完了,GC可能就可以回收的情形来说,可以尝试使用一下对象池(连接池,线程池也可以算)。对象池一般是给一个初始的容量参数,一次性或多次创建很多对象,每次需要创建时取一个即可使用,使用完了主动归还,如果不归还可能也会内存泄漏,因为对象池还在引用它(如果算法写好了应该可以收回),对象池对于以上频繁的创建生命周期很短的对象来说很有效,可以明显降低GC的压力,留出更多的CPU时间给业务使用。
一般操作系统的用的都是基于VM的内存管理,这样可以扩展有效的物理内存,热点数据在物理内存中,非热点数据会进去页面文件后等后备存储中,需要时中断取出,对于系统或应用来说这一机制是透明的。
目前有些性能较好的缓存应用也在使用VM进行内存管理,例如redis,真正没有测试过,据说性能提升明显,从理论上说,缓存的热点数据和非热点数据应该分别对待,这种机制还是可取的。
2.内存池
这里所说的内存池就是指一些应用上程序上的内存池,例如c语言开发的程序一般会有专门的内存池来管理内存,例如nignx的内存池。内存池存在的意义主要在于减少频繁的分配和释放内存(一般是操作系统的VM内存管理中保留和归还操作),这一部分相对于IO来说消耗比较少,但是对于内存的频繁使用消耗就会比较明显。还有就是可以减少内存泄漏和内存碎片的产生。
3.GC管理
一些很高级的语言提供了GC管理的机制,例如C#或Java等,其实GC本身就是一个大的内存池,托管堆就是GC管理的对象,只不过这个内存池来说比较高级而已,算法比较适合于业务语言的需求。其实C#使用特殊的函数完全可以从非托管堆上分配内存,也可以实现一个高性能的内存池,这样GC的压力就会降下来,当然这都是对于大量而且频繁的内存使用而言,否则完全没有必要。
4.对象池
对于一些使用C#或Java开发的应用来说,如果面临着同一种类型的大量对象的new操作,而且马上使用完了,GC可能就可以回收的情形来说,可以尝试使用一下对象池(连接池,线程池也可以算)。对象池一般是给一个初始的容量参数,一次性或多次创建很多对象,每次需要创建时取一个即可使用,使用完了主动归还,如果不归还可能也会内存泄漏,因为对象池还在引用它(如果算法写好了应该可以收回),对象池对于以上频繁的创建生命周期很短的对象来说很有效,可以明显降低GC的压力,留出更多的CPU时间给业务使用。
5.总结
频繁的内存申请,释放,拷贝应该得到优化!
【作者】:GUO Xingwang
【来源】:http://thriving-country.cnblogs.com/
本文版权归作者和博客园共同所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
【来源】:http://thriving-country.cnblogs.com/
本文版权归作者和博客园共同所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。