iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中的对象池怎么使用
  • 750
分享到

Java中的对象池怎么使用

2023-07-05 04:07:22 750人浏览 薄情痞子
摘要

本文小编为大家详细介绍“Java中的对象池怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的对象池怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 什么是对象池对象池,顾名思义就是一定

本文小编为大家详细介绍“Java中的对象池怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的对象池怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1. 什么是对象池

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

2. 对象池解决什么问题

减少频繁创建和销毁对象带来的成本,实现对象的缓存和复用,创建对象的成本比较大,并且创建比较频繁。比如线程的创建代价比较大,于是就有了常用的线程 池。对象池(模式)是一种创建型设计模式,它持有一个初始化好的对象的集合,将对象提供给调用者。

一般而言对于 创建对象的成本比较大,并且创建比较频繁。比如线程的创建代价比较大,于是就有了常用的线程池

3. 对象池的优缺点

3.1 对象池的优点

提升了t获取对象的响应速度,比如单个线程和资源连接的创建成本都比较大。

运用对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高时。

一定程度上减少了GC的压力。对于实时性要求较高的程序有很大的帮助

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

3.2 对象池弊端

脏对象的问题

所谓的脏对象就是指的是当对象被放回对象池后,还保留着刚刚被客户端调用时生成的数据。

脏对象可能带来两个问题:

1).脏对象持有上次使用的引用,导致内存泄漏等问题。

2). 脏对象如果下一次使用时没有做清理,可能影响程序的处理数据。

生命周期的问题

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

4. 对象池有什么特征

一般来说,对象池有下面几个特征:

(1)对象池中有一定数量已经创建好的对象

(2)对象池向用户提供获取对象的接口,当用户需要新的对象时,便可通过调用此接口获取新的对象。如果对象池中有事先创建好的对象时,就直接返回给用 户;如果没有了,对象池还可以创建新的对象加入其中,然后返回给用户

(3)对象池向用户提供归还对象的接口,当用户不再使用某对象时,便可通过此接口把该对象归还给对象池

5. 池的大小选择

通常情况下,我们需要控制对象池的大小如果对象池没有限制,可能导致对象池持有过多的闲置对象,增加内存的占用。如果对象池闲置过小,没有可用的对象时,会造成之前对象池无可用的对象时,再次请求出现的问题。

对象池的大小选取应该结合具体的使用场景,结合数据(触发池中无可用对象的频率)分析来确定。现在Java的对象分配操作不比C语言的malloc调用慢, 对于轻中量级的对象, 分配/释放对象的开销可以忽略不计,并发环境中, 多个线程可能(同时)需要获取池中对象, 进而需要在堆数据结构上进行同步或者因为竞争而产生阻塞, 这种开销要比创建销毁对象的开销高数百倍;由于池中对象的数量有限, 势必成为一个可伸缩性瓶颈;很难正确的设定对象池的大小, 如果太小则起不到作用, 如果过大, 则占用内存资源高。

空间换时间的折中,本质上,对象池属于空间换时间的折中。它通过缓存初始化好的对象来提升调用者请求对象的响应速度。除此之外,折中(tradeoff)是软件开发中的一个重要的概念,会贯穿整个软件开发过程中。

6. 对象池的使用

6.1 接入

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

6.2 实现线程池工厂

import com.scl.online.service.model.SxInferContext;import org.apache.commons.pool2.PooledObject;import org.apache.commons.pool2.PooledObjectFactory;import org.apache.commons.pool2.impl.DefaultPooledObject; public class InferContextPooledObjectFactory implements PooledObjectFactory<SxInferContext> {  @Override  public PooledObject<SxInferContext> makeObject() {    SxInferContext inferContext = new SxInferContext();    return new DefaultPooledObject<>(inferContext);  }  @Override  public void destroyObject(PooledObject<SxInferContext> pooledObject) {  }  @Override  public boolean validateObject(PooledObject<SxInferContext> pooledObject) {    return true;  }  @Override  public void activateObject(PooledObject<SxInferContext> pooledObject) {    pooledObject.getObject().initObject();  }  @Override  public void passivateObject(PooledObject<SxInferContext> pooledObject) {    // 当ObjectPool实例返还池中的时候调用    pooledObject.getObject().initObject();  }}

说明:

SxInferContext:为对象池里头的对象,对象借还都会调用到PooledObjectFactory里头的方法

PooledObjectFactory负责管理PooledObject,如:借出对象,返回对象,校验对象,有多少激活对象,有多少空闲对象。

方法描述
makeObject用于生成一个新的ObjectPool实例
activateObject每一个钝化(passivated)的ObjectPool实例从池中借出(borrowed)前调用
validateObject可能用于从池中借出对象时,对处于激活(activated)状态的ObjectPool实例进行测试确保它是有效的。也有可能在ObjectPool实例返还池中进行钝化前调用进行测试是否有效。它只对处于激活状态的实例调用
passivateObject当ObjectPool实例返还池中的时候调用
destroyObject当ObjectPool实例从池中被清理出去丢弃的时候调用(是否根据validateObject的测试结果由具体的实现在而定)

6.3 初始化

public GenericObjectPool<SxInferContext> contextPools;@PostConstruct  public void init() {    if (sxInferConfig.isObjectPoolUsable()) {      InferContextPooledObjectFactory factory = new InferContextPooledObjectFactory();      //设置对象池的相关参数      GenericObjectPoolConfig poolConfig = initConfig();      //新建一个对象池,传入对象工厂和配置      contextPools = new GenericObjectPool<>(factory, poolConfig);    }  }     public GenericObjectPoolConfig initConfig() {    GenericObjectPoolConfig cfg = new GenericObjectPoolConfig();    cfg.setJmxNamePrefix("objectPool");    //  对象总数    cfg.setMaxTotal(sxInferConfig.getPoolMaxTotal());    // 最大空闲对象数    cfg.setMaxIdle(sxInferConfig.getPoolMaxIdle());    // 最小空闲对象数    cfg.setMinIdle(sxInferConfig.getPoolMinIdle());    // 借对象阻塞最大等待时间    // 获取资源的等待时间。blockWhenExhausted 为 true 时有效。-1 代表无时间限制,一直阻塞直到有可用的资源    cfg.setMaxWaitMillis(sxInferConfig.getPoolMaxWait());    // 最小驱逐空闲时间    cfg.setMinEvictableIdleTimeMillis(sxInferConfig.getPoolMinEvictableIdleTimeMillis());    // 每次驱逐数量  资源回收线程执行一次回收操作,回收资源的数量。默认 3    cfg.setNumTestsPerEvictionRun(sxInferConfig.getPoolNumTestsPerEvictionRun());    // 回收资源线程的执行周期,默认 -1 表示不启用回收资源线程    cfg.setTimeBetweenEvictionRunsMillis(sxInferConfig.getPoolTimeBetweenEvictionRunsMillis());    // 资源耗尽时,是否阻塞等待获取资源,默认 true    cfg.setBlockWhenExhausted(sxInferConfig.isPoolBlockWhenExhausted());    return cfg;  }

6.4 使用

contextPools.borrowObject();
contextPools.returnObject();
等等 ....

说明:cfg.setJmxNamePrefix(“objectPool”); 假如项目中有用到Redis线程池,则需要配置一下JmxNamePrefix。redis线程池使用的是“pool”,假如有重复的,早调用线程池是时,就默认会调用到Redis线程池的PooledObjectFactory(假如redis线程池使用默认的话),导致配置的线程池不生效。

GenericObjectPool 方法解释:

方法描述
borrowObject从池中借出一个对象。要么调用PooledObjectFactory.makeObject方法创建,要么对一个空闲对象使用PooledObjectFactory.activeObject进行激活,然后使用PooledObjectFactory.validateObject方法进行验证后再返回
returnObject将一个对象返还给池。根据约定:对象必须 是使用borrowObject方法从池中借出的
invalidateObject废弃一个对象。根据约定:对象必须 是使用borrowObject方法从池中借出的。通常在对象发生了异常或其他问题时使用此方法废弃它
addObject使用工厂创建一个对象,钝化并且将它放入空闲对象池
getNumberIdle返回池中空闲的对象数量。有可能是池中可供借出对象的近似值。如果这个信息无效,返回一个负数
getNuMactive返回从借出的对象数量。如果这个信息不可用,返回一个负数
clear清除池中的所有空闲对象,释放其关联的资源(可选)。清除空闲对象必须使用PooledObjectFactory.destroyObject方法
close关闭池并释放关联的资源

读到这里,这篇“Java中的对象池怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Java中的对象池怎么使用

本文链接: https://www.lsjlt.com/news/349613.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中的对象池怎么使用
    本文小编为大家详细介绍“Java中的对象池怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的对象池怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 什么是对象池对象池,顾名思义就是一定...
    99+
    2023-07-05
  • 如何在java中使用对象池
    这篇文章将为大家详细讲解有关如何在java中使用对象池,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、说明(1)创建工厂类:通过继承BaseGenericObjectPool或者实现基础接...
    99+
    2023-06-15
  • Java中对象池怎么实现
    这篇“Java中对象池怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中对象池怎么实现”文章吧。1. 什么是对...
    99+
    2023-07-02
  • 怎么使用CocosCreator对象池
    本篇文章给大家分享的是有关怎么使用CocosCreator对象池,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体操作第一步:准备好 Prefab把你想要创建的节点事先设置好并...
    99+
    2023-06-14
  • Java GenericObjectPool对象池化技术怎么使用
    这篇文章主要介绍了Java GenericObjectPool对象池化技术怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java GenericObjectPool对象池化技术怎么使...
    99+
    2023-07-05
  • 详解Java中对象池的介绍与使用
    目录1. 什么是对象池2. 对象池解决什么问题3. 对象池的优缺点3.1 对象池的优点3.2 对象池弊端4. 对象池有什么特征5. 池的大小选择6. 对象池的使用6.1 接入6.2 ...
    99+
    2023-02-21
    Java对象池使用 Java对象池
  • Java BasePooledObjectFactory 对象池化技术的使用
    Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类 一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁...
    99+
    2023-05-14
    Java 对象池 Java 对象池BasePooledObjectFactory
  • golang对象池在网络中怎么使用
    在网络编程中,可以使用golang的对象池来管理网络连接对象,以提高资源的复用和性能。 首先,你需要定义一个对象池结构体,用来管理连...
    99+
    2023-10-26
    golang
  • Java中JSP的pageContext对象和page对象怎么使用
    这篇文章主要讲解了“Java中JSP的pageContext对象和page对象怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中JSP的pageContext对象和page对象...
    99+
    2023-07-05
  • Java中JSP的session对象和config对象怎么使用
    本篇内容主要讲解“Java中JSP的session对象和config对象怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中JSP的session对象和config对象怎么使用”吧!...
    99+
    2023-07-04
  • .NET Core 中对象池 Object Pool的使用
    目录一、什么是对象池二、.NET Core 中的对象池三、本文小结一、什么是对象池 对象池简单来说就是一种为对象提供可复用能力的软件设计思路。我们常说有借有还,再借不难,而对象池就...
    99+
    2024-04-02
  • Java BasePooledObjectFactory对象池化技术如何使用
    本篇内容主要讲解“Java BasePooledObjectFactory对象池化技术如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java BasePooledOb...
    99+
    2023-07-05
  • 如何使用CocosCreator对象池
    目录前言:具体操作第一步:准备好 Prefab第二步:初始化对象池第三步:从对象池请求对象第四步:将对象返回对象池第五步:使用组件来处理回收和复用的事件第六步:清除对象池前言: 在运...
    99+
    2024-04-02
  • 高效的Python通用对象池化库怎么使用
    本篇内容主要讲解“高效的Python通用对象池化库怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“高效的Python通用对象池化库怎么使用”吧!对象池模式主要适用于以下应用场景:资源受限的...
    99+
    2023-07-06
  • 一文搞懂Java中对象池的实现
    目录1. 什么是对象池2. 为什么需要对象池3. 对象池的实现4. 开源的对象池工具5. JedisPool 对象池实现分析6. 对象池总结最近在分析一个应用中的某个接口的耗时情况时...
    99+
    2024-04-02
  • java中怎么使用new创建对象
    在Java中,可以使用关键字new来创建一个对象。具体的语法是: 类名 对象名 = new 类名(); 其中,类名是要创建对象的类的...
    99+
    2023-10-24
    java
  • ASP.NETCore中的对象池介绍
    asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中。它本身...
    99+
    2024-04-02
  • Java Web HttpServletResponse对象怎么使用
    本篇内容主要讲解“Java Web HttpServletResponse对象怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Web HttpServletR...
    99+
    2023-06-29
  • .NET Core中对象池Object Pool的使用方法是什么
    这篇文章主要讲解了“.NET Core中对象池Object Pool的使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET Core中对象池Ob...
    99+
    2023-06-25
  • Java的JSP内置对象怎么使用
    本文小编为大家详细介绍“Java的JSP内置对象怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的JSP内置对象怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。JSP九大内置对象一览表为了简...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作