java 如何复用对象
对象复用的常见方法
对象池(Object Pool)模式 通过预先创建一组对象并保存在池中,使用时从池中获取,使用完毕后归还。适用于创建成本高的对象(如数据库连接、线程等)。Apache Commons Pool 是常用实现库。
享元(Flyweight)模式 将对象的共享部分(内部状态)与可变部分(外部状态)分离,减少重复对象的创建。适用于大量相似对象的场景,如字符渲染、游戏中的粒子系统。

单例(Singleton)模式 确保一个类只有一个实例,并提供全局访问点。适用于需要全局唯一对象的场景,如配置管理器、日志服务。
缓存重用
通过缓存机制存储频繁使用的对象。例如使用 WeakHashMap 或 Guava Cache 实现对象的软引用/弱引用缓存。

代码示例
对象池实现
// 使用 Apache Commons Pool
GenericObjectPool<ExpensiveObject> pool = new GenericObjectPool<>(
new BasePooledObjectFactory<ExpensiveObject>() {
@Override public ExpensiveObject create() throws Exception {
return new ExpensiveObject();
}
@Override public PooledObject<ExpensiveObject> wrap(ExpensiveObject obj) {
return new DefaultPooledObject<>(obj);
}
}
);
// 获取对象
ExpensiveObject obj = pool.borrowObject();
try {
// 使用对象
} finally {
// 归还对象
pool.returnObject(obj);
}
享元模式示例
// 共享的内部状态
class Flyweight {
private final String intrinsicState;
public Flyweight(String state) { this.intrinsicState = state; }
}
// 享元工厂
class FlyweightFactory {
private static final Map<String, Flyweight> pool = new HashMap<>();
public static Flyweight getFlyweight(String key) {
return pool.computeIfAbsent(key, Flyweight::new);
}
}
最佳实践
- 对于线程安全要求高的场景,使用线程安全的对象池或并发集合
- 注意对象重置:归还对象到池中前需清除状态
- 合理设置池大小:避免内存浪费或竞争
- 对于短期对象,优先考虑新建而非复用
性能考量
- 对象复用可能增加代码复杂度
- 需权衡对象创建开销与内存占用的平衡
- 使用 JVM 参数监控对象分配(如
-XX:+PrintGCDetails) - 考虑对象存活时间:长生命周期对象更适合复用






