最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中對象池的介紹與使用

 更新時間:2023年02月21日 15:28:06   作者:Dream_bin  
對象池,顧名思義就是一定數(shù)量的已經(jīng)創(chuàng)建好的對象(Object)的集合。這篇文章主要為大家介紹了Java中對象池的介紹與使用,感興趣的可以了解一下

1. 什么是對象池

對象池,顧名思義就是一定數(shù)量的已經(jīng)創(chuàng)建好的對象(Object)的集合。當(dāng)需要創(chuàng)建對象時,先在池子中獲取,如果池子中沒有符合條件的對象,再進(jìn)行創(chuàng)建新對象,同樣,當(dāng)對象需要銷毀時,不做真正的銷毀,而是將其setActive(false),并存入池子中。這樣就避免了大量對象的創(chuàng)建。

2. 對象池解決什么問題

減少頻繁創(chuàng)建和銷毀對象帶來的成本,實現(xiàn)對象的緩存和復(fù)用,創(chuàng)建對象的成本比較大,并且創(chuàng)建比較頻繁。比如線程的創(chuàng)建代價比較大,于是就有了常用的線程 池。對象池(模式)是一種創(chuàng)建型設(shè)計模式,它持有一個初始化好的對象的集合,將對象提供給調(diào)用者。

一般而言對于 創(chuàng)建對象的成本比較大,并且創(chuàng)建比較頻繁。比如線程的創(chuàng)建代價比較大,于是就有了常用的線程池。

3. 對象池的優(yōu)缺點

3.1 對象池的優(yōu)點

提升了t獲取對象的響應(yīng)速度,比如單個線程和資源連接的創(chuàng)建成本都比較大。

運用對象池化技術(shù)可以顯著地提升性能,尤其是當(dāng)對象的初始化過程代價較大或者頻率較高時。

一定程度上減少了GC的壓力。對于實時性要求較高的程序有很大的幫助

比如說 http 鏈接的對象池,Redis對象池等等都使用了對象池

3.2 對象池弊端

1.臟對象的問題

所謂的臟對象就是指的是當(dāng)對象被放回對象池后,還保留著剛剛被客戶端調(diào)用時生成的數(shù)據(jù)。

臟對象可能帶來兩個問題:

1).臟對象持有上次使用的引用,導(dǎo)致內(nèi)存泄漏等問題。

2). 臟對象如果下一次使用時沒有做清理,可能影響程序的處理數(shù)據(jù)。

2.生命周期的問題

處于對象池中的對象生命周期要比普通的對象要長久。維持大量的對象也是比較占用內(nèi)存空間的。

4. 對象池有什么特征

一般來說,對象池有下面幾個特征:

(1)對象池中有一定數(shù)量已經(jīng)創(chuàng)建好的對象

(2)對象池向用戶提供獲取對象的接口,當(dāng)用戶需要新的對象時,便可通過調(diào)用此接口獲取新的對象。如果對象池中有事先創(chuàng)建好的對象時,就直接返回給用 戶;如果沒有了,對象池還可以創(chuàng)建新的對象加入其中,然后返回給用戶

(3)對象池向用戶提供歸還對象的接口,當(dāng)用戶不再使用某對象時,便可通過此接口把該對象歸還給對象池

5. 池的大小選擇

通常情況下,我們需要控制對象池的大小如果對象池沒有限制,可能導(dǎo)致對象池持有過多的閑置對象,增加內(nèi)存的占用。如果對象池閑置過小,沒有可用的對象時,會造成之前對象池?zé)o可用的對象時,再次請求出現(xiàn)的問題。

對象池的大小選取應(yīng)該結(jié)合具體的使用場景,結(jié)合數(shù)據(jù)(觸發(fā)池中無可用對象的頻率)分析來確定。現(xiàn)在Java的對象分配操作不比c語言的malloc調(diào)用慢, 對于輕中量級的對象, 分配/釋放對象的開銷可以忽略不計,并發(fā)環(huán)境中, 多個線程可能(同時)需要獲取池中對象, 進(jìn)而需要在堆數(shù)據(jù)結(jié)構(gòu)上進(jìn)行同步或者因為鎖競爭而產(chǎn)生阻塞, 這種開銷要比創(chuàng)建銷毀對象的開銷高數(shù)百倍;由于池中對象的數(shù)量有限, 勢必成為一個可伸縮性瓶頸;很難正確的設(shè)定對象池的大小, 如果太小則起不到作用, 如果過大, 則占用內(nèi)存資源高。

空間換時間的折中,本質(zhì)上,對象池屬于空間換時間的折中。它通過緩存初始化好的對象來提升調(diào)用者請求對象的響應(yīng)速度。除此之外,折中(tradeoff)是軟件開發(fā)中的一個重要的概念,會貫穿整個軟件開發(fā)過程中。

6. 對象池的使用

6.1 接入

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

6.2 實現(xiàn)線程池工廠

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;

 /**
 * 實現(xiàn)PooledObjectFactory 
 * 
 * @author : cuilinsu
 * @since : 2021/4/14 17:56
 */
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) {
    // 當(dāng)ObjectPool實例返還池中的時候調(diào)用
    pooledObject.getObject().initObject();
  }
}

說明:

1.SxInferContext:為對象池里頭的對象,對象借還都會調(diào)用到PooledObjectFactory里頭的方法

2.PooledObjectFactory負(fù)責(zé)管理PooledObject,如:借出對象,返回對象,校驗對象,有多少激活對象,有多少空閑對象。

方法描述
makeObject用于生成一個新的ObjectPool實例
activateObject每一個鈍化(passivated)的ObjectPool實例從池中借出(borrowed)前調(diào)用
validateObject可能用于從池中借出對象時,對處于激活(activated)狀態(tài)的ObjectPool實例進(jìn)行測試確保它是有效的。也有可能在ObjectPool實例返還池中進(jìn)行鈍化前調(diào)用進(jìn)行測試是否有效。它只對處于激活狀態(tài)的實例調(diào)用
passivateObject當(dāng)ObjectPool實例返還池中的時候調(diào)用
destroyObject當(dāng)ObjectPool實例從池中被清理出去丟棄的時候調(diào)用(是否根據(jù)validateObject的測試結(jié)果由具體的實現(xiàn)在而定)

6.3 初始化

public GenericObjectPool<SxInferContext> contextPools;

@PostConstruct
  public void init() {
    if (sxInferConfig.isObjectPoolUsable()) {
      InferContextPooledObjectFactory factory = new InferContextPooledObjectFactory();
      //設(shè)置對象池的相關(guān)參數(shù)
      GenericObjectPoolConfig poolConfig = initConfig();
      //新建一個對象池,傳入對象工廠和配置
      contextPools = new GenericObjectPool<>(factory, poolConfig);
    }
  }


   /**
   \* 池子初始化
   *
   \* @param
   */
  public GenericObjectPoolConfig initConfig() {
    GenericObjectPoolConfig cfg = new GenericObjectPoolConfig();
    cfg.setJmxNamePrefix("objectPool");
    //  對象總數(shù)
    cfg.setMaxTotal(sxInferConfig.getPoolMaxTotal());
    // 最大空閑對象數(shù)
    cfg.setMaxIdle(sxInferConfig.getPoolMaxIdle());
    // 最小空閑對象數(shù)
    cfg.setMinIdle(sxInferConfig.getPoolMinIdle());
    // 借對象阻塞最大等待時間
    // 獲取資源的等待時間。blockWhenExhausted 為 true 時有效。-1 代表無時間限制,一直阻塞直到有可用的資源
    cfg.setMaxWaitMillis(sxInferConfig.getPoolMaxWait());
    // 最小驅(qū)逐空閑時間
    cfg.setMinEvictableIdleTimeMillis(sxInferConfig.getPoolMinEvictableIdleTimeMillis());
    // 每次驅(qū)逐數(shù)量  資源回收線程執(zhí)行一次回收操作,回收資源的數(shù)量。默認(rèn) 3
    cfg.setNumTestsPerEvictionRun(sxInferConfig.getPoolNumTestsPerEvictionRun());
    // 回收資源線程的執(zhí)行周期,默認(rèn) -1 表示不啟用回收資源線程
    cfg.setTimeBetweenEvictionRunsMillis(sxInferConfig.getPoolTimeBetweenEvictionRunsMillis());
    // 資源耗盡時,是否阻塞等待獲取資源,默認(rèn) true
    cfg.setBlockWhenExhausted(sxInferConfig.isPoolBlockWhenExhausted());
    return cfg;
  }

6.4 使用

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

說明:cfg.setJmxNamePrefix(“objectPool”); 假如項目中有用到redis線程池,則需要配置一下JmxNamePrefix。redis線程池使用的是“pool”,假如有重復(fù)的,早調(diào)用線程池是時,就默認(rèn)會調(diào)用到Redis線程池的PooledObjectFactory(假如redis線程池使用默認(rèn)的話),導(dǎo)致配置的線程池不生效。

GenericObjectPool 方法解釋:

方法描述
borrowObject從池中借出一個對象。要么調(diào)用PooledObjectFactory.makeObject方法創(chuàng)建,要么對一個空閑對象使用PooledObjectFactory.activeObject進(jìn)行激活,然后使用PooledObjectFactory.validateObject方法進(jìn)行驗證后再返回
returnObject將一個對象返還給池。根據(jù)約定:對象必須 是使用borrowObject方法從池中借出的
invalidateObject廢棄一個對象。根據(jù)約定:對象必須 是使用borrowObject方法從池中借出的。通常在對象發(fā)生了異?;蚱渌麊栴}時使用此方法廢棄它
addObject使用工廠創(chuàng)建一個對象,鈍化并且將它放入空閑對象池
getNumberIdle返回池中空閑的對象數(shù)量。有可能是池中可供借出對象的近似值。如果這個信息無效,返回一個負(fù)數(shù)
getNumActive返回從借出的對象數(shù)量。如果這個信息不可用,返回一個負(fù)數(shù)
clear清除池中的所有空閑對象,釋放其關(guān)聯(lián)的資源(可選)。清除空閑對象必須使用PooledObjectFactory.destroyObject方法
close關(guān)閉池并釋放關(guān)聯(lián)的資源

到此這篇關(guān)于詳解Java中對象池的介紹與使用的文章就介紹到這了,更多相關(guān)Java對象池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis中mapper代理的生成過程全面分析

    mybatis中mapper代理的生成過程全面分析

    這篇文章主要為大家介紹了mybatis中mapper代理的生成過程全面分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java正則表達(dá)式matcher.group()用法代碼

    Java正則表達(dá)式matcher.group()用法代碼

    這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式matcher.group()用法的相關(guān)資料,最近在做一個項目,需要使用matcher.group()方法匹配出需要的內(nèi)容,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • java發(fā)送短信的實現(xiàn)步驟

    java發(fā)送短信的實現(xiàn)步驟

    下面小編就為大家?guī)硪黄猨ava發(fā)送短信的實現(xiàn)步驟。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 基于java中cookie和session的比較

    基于java中cookie和session的比較

    下面小編就為大家?guī)硪黄趈ava中cookie和session的比較。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • java Arrays類詳解及實例代碼

    java Arrays類詳解及實例代碼

    這篇文章主要介紹了java Arrays類詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 帶你快速搞定java并發(fā)庫

    帶你快速搞定java并發(fā)庫

    本文主要介紹了java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法,具有很好的參考價值。下面跟著小編一起來看下吧,希望能給你帶來幫助
    2021-07-07
  • java日期工具類實例分享

    java日期工具類實例分享

    本文介紹一個java日期工具類,功能有英文簡寫、英文全稱、精確到毫秒的完整時間、中文簡寫、中文全稱等方法
    2014-01-01
  • Jax-rs規(guī)范REST接口文件上傳代碼實例

    Jax-rs規(guī)范REST接口文件上傳代碼實例

    這篇文章主要介紹了Jax-rs規(guī)范REST接口文件上傳代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • JavaWeb入門教程之分頁查詢功能的簡單實現(xiàn)

    JavaWeb入門教程之分頁查詢功能的簡單實現(xiàn)

    這篇文章主要介紹了JavaWeb入門教程之分頁查詢功能的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java內(nèi)部類使用總結(jié)

    java內(nèi)部類使用總結(jié)

    本文主要介紹了java內(nèi)部類使用總結(jié)。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02

最新評論

鄯善县| 左权县| 金阳县| 延安市| 增城市| 连平县| 武城县| 黔南| 从江县| 五莲县| 商南县| 大埔区| 安图县| 五峰| 平湖市| 农安县| 句容市| 商洛市| 太白县| 临漳县| 鱼台县| 莎车县| 阳高县| 喀喇沁旗| 马尔康县| 巴里| 海城市| 莒南县| 内江市| 大田县| 新化县| 巧家县| 芮城县| 鄢陵县| 汉中市| 玛沁县| 花莲市| 福州市| 肥城市| 蒙城县| 延吉市|