独家揭秘!池化技术的秘密用途!

125 阅读5分钟

关注微信公众号 程序员小胖 每日技术干货,第一时间送达!

什么是池化技术

池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。

在系统开发过程中,我们经常会用到池化技术。通俗的讲,池化技术就是:把一些资源预先分配好,组织到对象池中,之后的业务使用资源从对象池中获取,使用完后放回到对象池中。这样做带来几个明显的好处:

  • 资源重复使用, 减少了资源分配和释放过程中的系统消耗。比如,在IO密集型的服务器上,并发处理过程中的子线程或子进程的创建和销毁过程,带来的系统开销将是难以接受的。所以在业务实现上,通常把一些资源预先分配好,如线程池,数据库连接池,Redis连接池,HTTP连接池等,来减少系统消耗,提升系统性能。

  • 可以对资源的整体使用做限制。这个好理解,相关资源预分配且只在预分配是生成,后续不再动态添加,从而限制了整个系统对资源的使用上限。类似一个令牌桶的功能。

  • 池化技术分配对象池,通常会集中分配,这样有效避免了碎片化的问题。

池化技术用在哪里

其实越是高深的技术离我们越近,之所以 “不识庐山真面目”是因为我们对很多技术没有经过深层次的思考,只是简单的使用。往往很简单的技术应用下面是有很强大的知识作为支撑的,接下来看几个使用场景.

线程池

事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。

优点

  • 降低资源消耗:重用存在的线程,减少对象创建销毁的开销。
  • 提高响应速度。可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
  • 附加功能:提供定时执行、定期执行、单线程、并发数控制等功能。 综上所述使用线程池框架 Executor 能更好的管理线程、提供系统资源使用率。

缺点

  • 占用一定的内存空间。
  • 线程越多CPU的调度开销越大。
  • 程序的复杂度会上升。

对象池

就是一定数量的已经创建好的对象(Object)的集合。当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对象,同样,当对象需要销毁时,不做真正的销毁,而是将其setActive(false),并存入池子中。这样就避免了大量对象的创建。

优点

  • 提升了t获取对象的响应速度,比如单个线程和资源连接的创建成本都比较大。
  • 运用对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高时。
  • 一定程度上减少了GC的压力。对于实时性要求较高的程序有很大的帮助

比如说 http 链接的对象池,Redis对象池等等都使用了对象池

缺点

  • 脏对象的问题 所谓的脏对象就是指的是当对象被放回对象池后,还保留着刚刚被客户端调用时生成的数据。脏对象可能带来两个问题:
    • 脏对象持有上次使用的引用,导致内存泄漏等问题。
    • 脏对象如果下一次使用时没有做清理,可能影响程序的处理数据。
  • 生命周期的问题

处于对象池中的对象生命周期要比普通的对象要长久。维持大量的对象也是比较占用内存空间的

连接池

池化技术的一种实现,用于创建和管理一个连接的缓冲池。这些连接被设计为可以被任何需要它们的线程使用,连接池的主要目的是共享连接,减少连接的创建和复用次数,从而提高连接的利用率和程序性能。当应用程序需要与数据库交互时,它会从连接池中获取一个连接,使用完毕后,将连接释放回连接池。连接池通常包含一定数量的数据库连接,当连接池中的连接用完时,需要等待其他客户端断开连接才能创建新的连接

优点

  • 减少连接创建时间。
  • 简化编程模式。
  • 受控的资源使用。
  • 提高资源利用率和性能。

缺点

  • 网络IO较多。
  • 数据库的负载较高。
  • 响应时间较长及QPS较低。
  • 应用频繁的创建连接和关闭连接,导致临时对象较多,GC频繁。
  • 设计和实现较为复杂,容易出错。
  • 如果连接池管理不当,可能会出现一些安全问题和性能问题。

相信你通过此篇文章对池化技术的优缺点都有了大概的了解吧,后面用到相关技术的时候可以做下深度的研究。