深入研究池化技术——对象池

池化技术

池化技术是性能调优的重要措施,池化的思想是把对象放到池子里,当要使用的时候,从池子里面拿对象,用完后再放回池子里,这样可以降低资源分配以及释放的开销,从而提升性能,在实际项目中,其实我们每天都在使用池化技术。关于池化技术有以下几种:

  • 对象池:通过复用对象,减少对象的创建、垃圾回收的开销
  • 线程池:通过复用线程来提升性能
  • 连接池:如数据库连接池/Redis连接池/HTTP连接池,通过复用TCP连接来减少创建和释放连接的时间来提升性能。

本文,我们详细来探讨一下对象池。

对象池

对象池用于维护一些很大、创建很慢的对象,提升性能。
对象池也有缺点,就是有一定的学习成本,并且增加代码的复杂度。

Commons-Pool2

Commons-Pool2是Apache基金会开源的对象池框架
官网地址
GitHub地址

Commons提供了两类对象池:

  • ObjectPool
  • KeyedObjectPool
ObjectPool
实现类 作用
BaseObjectPool 抽象类,用来扩展自己的对象池
ErodingObjectPool “腐蚀”对象池,代理一个对象池,并基于factor参数,为其添加“腐蚀”行为。归还的对象被腐蚀后,将会丢弃,而不是添加到空闲容量中。
GenericObjectPool 一个可配置的通用对象池实现。
ProxiedObjectPool 代理一个其他的对象池,并基于动态代理(支持JDK代理和CGLib代理),返回一个代理后的对象。该对象池主要用来增强对池化对象的控制,比如防止在归还该对象后,还继续使用该对象等。
SoftReferenceObjectPool 基于软引用的对象池
SynchronizedObjectPool 代理一个其他对象池,并为其提供线程安全的能力。

ObjectPool核心API

方法名 作用
borrowObject 从对象池中借对象
returnObject() 将对象归还到对象池
invalidateObject() 失效一个对象
addObject() 增加一个空闲对象,该方法适用于使用空闲对象预加载对象池
clear() 清空空闲的所有对象,并释放相关资源
close() 关闭对象池,并释放相关资源
getNumIdle() 获得空闲对象数量
getNumActive() 获得被借出对象数量
KeyedObjectPool
实现类 作用
ErodingKeyedObjectPool 作用
GenericKeyedObjectPool 类似GenericObjectPool
ProxiedKeyedObjectPool 类似ProxiedObjectPool
SynchronizedKeyedObjectPool 类似SynchronizedObjectPool

它和ObjectPool的主要区别在于,它是通过Key去找对象的,从设计上来说KeyedObjectPool与ObjectPool没有区别。

快速入门

首先我们添加CommonsPools2的依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>

定义一个对象,并模拟对象创建慢的场景:

public class SlowObject {
   
   
    public SlowObject(String name, Integer age) {
   
   
        this.name = name;
        this.age = age;
    }

    public static SlowObject init() {
   
   
        //模拟对象创建慢的场景
        try {
   
   
            Thread.sleep(10L);
        }catch (InterruptedException e) {
   
   
            e.printStackTrace();
        }
        return new SlowObject("小飞龙",20);
    }

    private String name;
    private Integer age;
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值