内存池线程池连接池,这些池子里面放的都是什么?
Posted 编程帮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存池线程池连接池,这些池子里面放的都是什么?相关的知识,希望对你有一定的参考价值。
老鼠可不得了,不仅偷吃,还喜欢囤积粮食。掏开老鼠洞,里面堆满了玉米、大米、花生、瓜子等等,如同一个粮食铺。
其实屯粮是老鼠的一个“优良传统”,它们在丰收时把种子存起来,等到了冬天粮食物资匮乏的时候好拿来充饥。
手里有粮,心中不慌!
内存池、线程池、连接池和“老鼠屯粮”是一个道理。
内存、线程、网络连接都是计算机的资源,是程序的“粮食”。
申请计算机资源是有代价的,会涉及到很多系统调用,也非常消耗CPU,也有时间延迟。
如果你的程序有很多类似的工作,或者需要频繁地申请资源,如果没有在这方面进行优化,那么这部分代码很有可能成为影响你整个程序性能的瓶颈。
为了解决这个问题,程序员也要像小老鼠一样未雨绸缪,提前给程序准备足够多的资源,以备不时之需,这就是池化技术。
所谓“池化技术”,就是程序预先向系统申请过量的资源(比如内存、线程、网络连接等),然后把它们保存起来,等用到的时候,再把它们拿出来。
这个保存资源的地方(一般就是内存)就叫“池子”。
之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。
以服务器上的线程池为例,它的主要思想是:先启动若干数量的线程,让它们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程又进入睡眠状态。
将过量的资源堆积到“池子”里也是有代价的,你得负责管理这些资源,这往往涉及到复杂的算法,是一个永远研究不完的话题。
以内存池为例,你得管着何时分配内存,何时回收内存,如何整理内存碎片。
在内存池中找到一个合适的位置给程序分配内存已经不容易,究竟什么时候回收内存更是整个计算机界的难题。
Java、Python、javascript、C#、Golang 这些高级编程语言的垃圾内存回收机制,说白了就是研究如何高效地使用内存池。
Golang 是2009年发布的,到现在还没有解决好垃圾内存回收的问题。
Java 已经二十多岁了,偶尔也会有内存泄漏。
连顶尖的公司,顶尖的程序员都不能100%解决内存管理的问题,它的难度就可想而知了。
以上是关于内存池线程池连接池,这些池子里面放的都是什么?的主要内容,如果未能解决你的问题,请参考以下文章