内存池线程池连接池,这些池子里面放的都是什么?

Posted 编程帮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存池线程池连接池,这些池子里面放的都是什么?相关的知识,希望对你有一定的参考价值。

老鼠可不得了,不仅偷吃,还喜欢囤积粮食。掏开老鼠洞,里面堆满了玉米、大米、花生、瓜子等等,如同一个粮食铺。


其实屯粮是老鼠的一个“优良传统”,它们在丰收时把种子存起来,等到了冬天粮食物资匮乏的时候好拿来充饥。


手里有粮,心中不慌!

内存池、线程池、连接池和“老鼠屯粮”是一个道理。


内存、线程、网络连接都是计算机的资源,是程序的“粮食”。


申请计算机资源是有代价的,会涉及到很多系统调用,也非常消耗CPU,也有时间延迟。


如果你的程序有很多类似的工作,或者需要频繁地申请资源,如果没有在这方面进行优化,那么这部分代码很有可能成为影响你整个程序性能的瓶颈。


为了解决这个问题,程序员也要像小老鼠一样未雨绸缪,提前给程序准备足够多的资源,以备不时之需,这就是池化技术


所谓“池化技术”,就是程序预先向系统申请过量的资源(比如内存、线程、网络连接等),然后把它们保存起来,等用到的时候,再把它们拿出来。


这个保存资源的地方(一般就是内存)就叫“池子”。


之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。


以服务器上的线程池为例,它的主要思想是:先启动若干数量的线程,让它们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程又进入睡眠状态。

将过量的资源堆积到“池子”里也是有代价的,你得负责管理这些资源,这往往涉及到复杂的算法,是一个永远研究不完的话题。


以内存池为例,你得管着何时分配内存,何时回收内存,如何整理内存碎片。


在内存池中找到一个合适的位置给程序分配内存已经不容易,究竟什么时候回收内存更是整个计算机界的难题。


Java、Python、javascript、C#、Golang 这些高级编程语言的垃圾内存回收机制,说白了就是研究如何高效地使用内存池。


Golang 是2009年发布的,到现在还没有解决好垃圾内存回收的问题。


Java 已经二十多岁了,偶尔也会有内存泄漏。


连顶尖的公司,顶尖的程序员都不能100%解决内存管理的问题,它的难度就可想而知了。

以上是关于内存池线程池连接池,这些池子里面放的都是什么?的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接池

干货|数据库连接池

线程池是怎样工作的

java---连接池的学习

数据库连接池

Java 线程池