幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

Java池化技术你了解多少?

  在我们平常的编码中,通常会将一些对象保存起来,这主要考虑的是对象的创建成本。比如像线程资源、数据库连接资源或者TCP连接等,这类对象的初始化通常要花费比较长的时间,如果频繁地申请和销毁,就会耗费大量的系统资源,造成不必要的性能损失。
  并且这些对象都有一个显著的特征,就是通过轻量级的重置工作,可以循环、重复地使用。这个时候,我们就可以使用一个虚拟的池子,将这些资源保存起来,当使用的时候,我们就从池子里快速获取一个即可。
  在Java中,池化技术应用非常广泛,常见的就有数据库连接池、线程池等,本文主讲连接池,线程池我们将在后续的博客中进行介绍。公用池化包CommonsPool2简介
  我们首先来看一下Java中公用的池化包CommonsPool2,来了解一下对象池的一般结构。根据我们的业务需求,使用这套API能够很容易实现对象的池化管理。!https:mvnrepository。comartifactorg。apache。commonscommonspool2dependencygroupIdorg。apache。commonsgroupIdcommonspool2artifactIdversion2。11。1versiondependency
  GenericObjectPool是对象池的核心类,通过传入一个对象池的配置和一个对象的工厂,即可快速创建对象池。publicGenericObjectPool(finalPooledObjectFactoryTfactory,finalGenericObjectPoolConfigTconfig)案例
  Redis的常用客户端Jedis,就是使用CommonsPool管理连接池的,可以说是一个最佳实践。下图是Jedis使用工厂创建对象的主要代码块。对象工厂类最主要的方法就是makeObject,它的返回值是PooledObject类型,可以将对象使用newDefaultPooledObject(obj)进行简单包装返回。
  redis。clients。jedis。JedisFactory,使用工厂创建对象。OverridepublicPooledObjectJedismakeObject()throwsException{Jedisjedisnull;try{jedisnewJedis(jedisSocketFactory,clientConfig);主要的耗时操作jedis。connect();返回包装对象returnnewDefaultPooledObject(jedis);}catch(JedisExceptionje){if(jedis!null){try{jedis。quit();}catch(RuntimeExceptione){logger。warn(ErrorwhileQUIT,e);}try{jedis。close();}catch(RuntimeExceptione){logger。warn(Errorwhileclose,e);}}throwje;}}
  我们再来介绍一下对象的生成过程,如下图,对象在进行获取时,将首先尝试从对象池里拿出一个,如果对象池中没有空闲的对象,就使用工厂类提供的方法,生成一个新的。publicTborrowObject(finalDurationborrowMaxWaitDuration)throwsException{此处省略若干行while(pnull){createfalse;首先尝试从池子中获取。pidleObjects。pollFirst();池子里获取不到,才调用工厂内生成新实例if(pnull){pcreate();if(p!null){createtrue;}}此处省略若干行}此处省略若干行}
  那对象是存在什么地方的呢?这个存储的职责,就是由一个叫作LinkedBlockingDeque的结构来承担的,它是一个双向的队列。
  接下来看一下GenericObjectPoolConfig的主要属性:GenericObjectPoolConfig本身的属性privateintmaxTotalDEFAULTMAXTOTAL;privateintmaxIdleDEFAULTMAXIDLE;privateintminIdleDEFAULTMINIDLE;其父类BaseObjectPoolConfig的属性privatebooleanlifoDEFAULTLIFO;privatebooleanfairnessDEFAULTFAIRNESS;privatelongmaxWaitMillisDEFAULTMAXWAITMILLIS;privatelongminEvictableIdleTimeMillisDEFAULTMINEVICTABLEIDLETIMEMILLIS;privatelongevictorShutdownTimeoutMillisDEFAULTEVICTORSHUTDOWNTIMEOUTMILLIS;privatelongsoftMinEvictableIdleTimeMillisDEFAULTSOFTMINEVICTABLEIDLETIMEMILLIS;privateintnumTestsPerEvictionRunDEFAULTNUMTESTSPEREVICTIONRUN;privateEvictionPolicyTevictionPolicynull;Only2。6。0applicationssetthisprivateStringevictionPolicyClassNameDEFAULTEVICTIONPOLICYCLASSNAME;privatebooleantestOnCreateDEFAULTTESTONCREATE;privatebooleantestOnBorrowDEFAULTTESTONBORROW;privatebooleantestOnReturnDEFAULTTESTONRETURN;privatebooleantestWhileIdleDEFAULTTESTWHILEIDLE;privatelongtimeBetweenEvictionRunsMillisDEFAULTTIMEBETWEENEVICTIONRUNSMILLIS;privatebooleanblockWhenExhaustedDEFAULTBLOCKWHENEXHAUSTED;
  参数很多,要想了解参数的意义,我们首先来看一下一个池化对象在整个池子中的生命周期。如下图所示,池子的操作主要有两个:一个是业务线程,一个是检测线程。
  对象池在进行初始化时,要指定三个主要的参数:maxTotal对象池中管理的对象上限maxIdle最大空闲数minIdle最小空闲数
  其中maxTotal和业务线程有关,当业务线程想要获取对象时,会首先检测是否有空闲的对象。如果有,则返回一个;否则进入创建逻辑。此时,如果池中个数已经达到了最大值,就会创建失败,返回空对象。
  对象在获取的时候,有一个非常重要的参数,那就是最大等待时间(maxWaitMillis),这个参数对应用方的性能影响是比较大的。该参数默认为1,表示永不超时,直到有对象空闲。
  如下图,如果对象创建非常缓慢或者使用非常繁忙,业务线程会持续阻塞(blockWhenExhausted默认为true),进而导致正常服务也不能运行。
  面试题
  一般面试官会问:你会把超时参数设置成多大呢?
  我一般都会把最大等待时间,设置成接口可以忍受的最大延迟。比如,一个正常服务响应时间10ms左右,达到1秒钟就会感觉到卡顿,那么这个参数设置成5001000ms都是可以的。超时之后,会抛出NoSuchElementException异常,请求会快速失败,不会影响其他业务线程,这种FailFast的思想,在互联网应用非常广泛。
  带有evcit字样的参数,主要是处理对象逐出的。池化对象除了初始化和销毁的时候比较昂贵,在运行时也会占用系统资源。比如,连接池会占用多条连接,线程池会增加调度开销等。业务在突发流量下,会申请到超出正常情况的对象资源,放在池子中。等这些对象不再被使用,我们就需要把它清理掉。
  超出minEvictableIdleTimeMillis参数指定值的对象,就会被强制回收掉,这个值默认是30分钟;softMinEvictableIdleTimeMillis参数类似,但它只有在当前对象数量大于minIdle的时候才会执行移除,所以前者的动作要更暴力一些。
  还有4个test参数:testOnCreate、testOnBorrow、testOnReturn、testWhileIdle,分别指定了在创建、获取、归还、空闲检测的时候,是否对池化对象进行有效性检测。
  开启这些检测,能保证资源的有效性,但它会耗费性能,所以默认为false。生产环境上,建议只将testWhileIdle设置为true,并通过调整空闲检测时间间隔(timeBetweenEvictionRunsMillis),比如1分钟,来保证资源的可用性,同时也保证效率。JMH测试
  使用连接池和不使用连接池,它们之间的性能差距到底有多大呢?下面是一个简单的JMH测试例子(见仓库),进行一个简单的set操作,为redis的key设置一个随机值。Fork(2)State(Scope。Benchmark)Warmup(iterations5,time1)Measurement(iterations5,time1)BenchmarkMode(Mode。Throughput)publicclassJedisPoolVSJedisBenchmark{JedisPoolpoolnewJedisPool(localhost,6379);BenchmarkpublicvoidtestPool(){Jedisjedispool。getResource();jedis。set(a,UUID。randomUUID()。toString());jedis。close();}BenchmarkpublicvoidtestJedis(){JedisjedisnewJedis(localhost,6379);jedis。set(a,UUID。randomUUID()。toString());jedis。close();}此处省略若干行}
  将测试结果使用metachart作图,展示结果如下图所示,可以看到使用了连接池的方式,它的吞吐量是未使用连接池方式的5倍!
  数据库连接池HikariCP
  HikariCP源于日语光,光的意思,寓意软件工作速度和光速一样快,它是SpringBoot中默认的数据库连接池。数据库是我们工作中经常使用到的组件,针对数据库设计的客户端连接池是非常多的,它的设计原理与我们在本文开头提到的基本一致,可以有效地减少数据库连接创建、销毁的资源消耗。
  同是连接池,它们的性能也是有差别的,下图是HikariCP官方的一张测试图,可以看到它优异的性能,官方的JMH测试代码见Github。
  一般面试题是这么问的:HikariCP为什么快呢?主要有三个方面:它使用FastList替代ArrayList,通过初始化的默认值,减少了越界检查的操作;优化并精简了字节码,通过使用Javassist,减少了动态代理的性能损耗,比如使用invokestatic指令代替invokevirtual指令;实现了无锁的ConcurrentBag,减少了并发场景下的锁竞争。
  HikariCP对性能的一些优化操作,是非常值得我们借鉴的,在之后的博客中,我们将详细分析几个优化场景。
  数据库连接池同样面临一个最大值(maximumPoolSize)和最小值(minimumIdle)的问题。这里同样有一个非常高频的面试题:你平常会把连接池设置成多大呢?
  很多同学认为,连接池的大小设置得越大越好,有的同学甚至把这个值设置成1000以上,这是一种误解。根据经验,数据库连接,只需要2050个就够用了。具体的大小,要根据业务属性进行调整,但大得离谱肯定是不合适的。
  HikariCP官方是不推荐设置minimumIdle这个值的,它将被默认设置成和maximumPoolSize一样的大小。如果你的数据库Server端连接资源空闲较大,不妨也可以去掉连接池的动态调整功能。
  另外,根据数据库查询和事务类型,一个应用中是可以配置多个数据库连接池的,这个优化技巧很少有人知道,在此简要描述一下。
  业务类型通常有两种:一种需要快速的响应时间,把数据尽快返回给用户;另外一种是可以在后台慢慢执行,耗时比较长,对时效性要求不高。如果这两种业务类型,共用一个数据库连接池,就容易发生资源争抢,进而影响接口响应速度。虽然微服务能够解决这种情况,但大多数服务是没有这种条件的,这时就可以对连接池进行拆分。
  如图,在同一个业务中,根据业务的属性,我们分了两个连接池,就是来处理这种情况的。
  HikariCP还提到了另外一个知识点,在JDBC4的协议中,通过Connection。isValid()就可以检测连接的有效性。这样,我们就不用设置一大堆的test参数了,HikariCP也没有提供这样的参数。结果缓存池
  到了这里你可能会发现池(Pool)与缓存(Cache)有许多相似之处。
  它们之间的一个共同点,就是将对象加工后,存储在相对高速的区域。我习惯性将缓存看作是数据对象,而把池中的对象看作是执行对象。缓存中的数据有一个命中率问题,而池中的对象一般都是对等的。
  考虑下面一个场景,jsp提供了网页的动态功能,它可以在执行后,编译成class文件,加快执行速度;再或者,一些媒体平台,会将热门文章,定时转化成静态的html页面,仅靠nginx的负载均衡即可应对高并发请求(动静分离)。
  这些时候,你很难说清楚,这是针对缓存的优化,还是针对对象进行了池化,它们在本质上只是保存了某个执行步骤的结果,使得下次访问时不需要从头再来。我通常把这种技术叫作结果缓存池(ResultCachePool),属于多种优化手段的综合。小结
  下面我来简单总结一下本文的内容重点:
  我们从Java中最通用的公用池化包CommonsPool2说起,介绍了它的一些实现细节,并对一些重要参数的应用做了讲解;Jedis就是在CommonsPool2的基础上封装的,通过JMH测试,我们发现对象池化之后,有了接近5倍的性能提升;接下来介绍了数据库连接池中速度速快的HikariCP,它在池化技术之上,又通过编码技巧进行了进一步的性能提升,HikariCP是我重点研究的类库之一,我也建议你加入自己的任务清单中。
  总体来说,当你遇到下面的场景,就可以考虑使用池化来增加系统性能:对象的创建或者销毁,需要耗费较多的系统资源;对象的创建或者销毁,耗时长,需要繁杂的操作和较长时间的等待;对象创建后,通过一些状态重置,可被反复使用。
  将对象池化之后,只是开启了第一步优化。要想达到最优性能,就不得不调整池的一些关键参数,合理的池大小加上合理的超时时间,就可以让池发挥更大的价值。和缓存的命中率类似,对池的监控也是非常重要的。
  如下图,可以看到数据库连接池连接数长时间保持在高位不释放,同时等待的线程数急剧增加,这就能帮我们快速定位到数据库的事务问题。
  平常的编码中,有很多类似的场景。比如Http连接池,Okhttp和Httpclient就都提供了连接池的概念,你可以类比着去分析一下,关注点也是在连接大小和超时时间上;在底层的中间件,比如RPC,也通常使用连接池技术加速资源获取,比如Dubbo连接池、Feign切换成httppclient的实现等技术。
  你会发现,在不同资源层面的池化设计也是类似的。比如线程池,通过队列对任务进行了二层缓冲,提供了多样的拒绝策略等,线程池我们将在后续的文章中进行介绍。
  线程池的这些特性,你同样可以借鉴到连接池技术中,用来缓解请求溢出,创建一些溢出策略。现实情况中,我们也会这么做。那么具体怎么做?有哪些做法?这部分内容就留给大家思考了。
  来源:tomcat。blog。csdn。netarticledetails123867269

山东人到底有多能喝?关于各省份人的能喝,我们听到过各种俗语:一部豫酒史,半部国酒史,东北虎,西北狼,喝不过江苏小绵羊,来了内蒙都得躺关于山东人有多能喝的俗语,却鲜为人知。原因无他山东人的酒量……新闻观察税费红包助市场主体减负纾困增活力央视网消息:国家税务总局相关负责人介绍,截至11月10日,全国税务系统合计办理新增减税降费及退税缓税缓费超3。7万亿元。业内人士表示,今年以来,中国实施新的组合式税费支持政策、……一天3次!中秋佳节扬州被央视连续聚焦中秋佳节扬州在严格落实好疫情防控各项举措的前提下举办了丰富的特色文旅活动10日晚,瘦西湖夜景3次登上央视中秋之夜,扬州夜景三上央视天下三分明……如果李嘉诚儿子没有卖掉腾讯20股份,他儿子会超越李嘉诚吗在过去的10到20年前,绝对是移动互联网的天下。踊跃出了阿里巴巴、腾讯、华为、小米等这些大型的互联网公司,互联网行业热火朝天。而且成就了很多互联网大佬,例如马云、马化腾这些数一……西双版纳,1秒穿越东南亚,夜市比曼谷更好逛,秋冬避寒刚刚好去过了风花雪月的昆明丽江大理,去过了纯净古朴的滇东南,去过了泡温泉,看火山,赏银杏的腾冲,不少小伙伴儿都会问,云南还有哪里好玩呢?小红书遛狗局来西双版纳吧,她绝对不……各种运动场地一应俱全的广东度假村,已经废弃七八年卫星图上看中了这个地方一段时间了。资料搜了一下,这个度假村以温泉为主打。配备了羽毛球场、篮球场、攀岩、足球场、乒乓球馆、网球场等体育设施,一应俱全。曾经是中国足协官方指定……26家银行退出理财发行市场理财公司为何成银行理财主角?你有没有发现,现在的银行理财产品越来越多是某某理财发行,而不是某某银行发行。近日,中信建投发布银行业研究报告指出,今年上半年发行理财产品的银行机构数量显著减少,预计有26家中小……逵哥影说河源今昔左岸,新城初起左岸,在巴黎是一个浪漫、文气的概念,指的是塞纳河左岸的圣日耳曼大街、一个集中了咖啡馆、书店、画廊、美术馆、博物馆的文化胜地。我到过格尔木,这是一座兴起不到70年的城市,但……别上当!这些化妆品检测方法不靠谱现在一些网站上会出现非专业机构的化妆品测评结果,不少消费者把这些测评当作自己购买和使用化妆品的重要参考。但在专业人士看来,有些测评的方法和结果会严重误导消费者。图片源于网……冯冼芳遗古霞洞山海电白好心之城在粤西有这么一片土地:它是唐太宗与冯盎沉香对话涉及地,唐朝宰相许敬宗女儿下嫁地。有汉唐古荔枝林,厚重的冼夫人文化,冯冼家族墓葬群,唐代冯家村遗址。这座古镇随着现代考古发现,让更……真没想到,百脉泉公园内的三组名泉,都是人工钻孔而成的位于济南市区东部50公里处的章丘,历来有小泉城之称,因为所辖区域内泉水丰富,山明水秀,群泉汇集。特别是位于城区内的百脉泉,更是泉城济南的五大泉群之一,享有盛名。百脉泉因百……雷霆系列军工气质的全能硬派扩音器雷霆系列主要针对户外便携扩音的场景打造。由于其独特的军工气质、硬派的性能、极致的工艺细节,不仅满足团队拓展、人流疏导、导游带团需要,更受到野外军训操练的青睐。自诞生以来,雷霆系……
宁德时代吴凯动力电池技术创新助推全面电动化在2022中国电动汽车百人会发言的宁德时代首席科学家吴凯一年前,宁德时代董事长曾毓群先生在行业内首次提出,未来5年间动力电池将进入TWh时代。当时来看,这一判断很激……山西男子到贵州旅游被困,采药小伙背他救出,半年后帮小伙开药店贵州荒无人烟的深山里,一个小伙子背着一个男子,在缓慢的前行,尽管小伙子很累了,但是依旧不肯放弃。毕竟这是一条人命,怎么能不管不顾,至少这个小伙子做不到。中年男子当然很是感激,这……微信支付正式上线防骗客服提醒功能IT之家12月14日消息,今天,腾讯微信官方宣布,微信支付正式上线防骗客服提醒功能,当你在支付过程中遇到风险交易时,支付界面会弹出接听提醒按钮,腾讯云智服提供实时在线客服,协助……中国第1美国第7冬残奥奖牌榜更新!中国单日4金反超乌克兰北京时间3月7日,在3月6日举行的所有冬残奥会项目里,中国体育代表队成为最大赢家,单日总计8个项目所有8枚金牌里,中国队单日斩获4金,是所有代表队里收获最多的,也让中国队在奖牌……这三种病都不是病?而是年龄到了!过度治疗反而伤身,坦然接受上了年纪之后,首先,就会出现视力下降的问题,我的父亲就是一位比常人来说视力下降更快的人,因为他年轻的时候,不健康的饮食习惯和作息习惯。上了年纪之后,很容易诱发一些老年性疾……14年老牌游戏!反恐精英OL又出新模式ampampamp武器就在今年7月份,《反恐精英OL》迎来了本年度的暑期大更新。从08年游戏诞生,到09年生化模式的异军突起,再到现在的多样有趣,这款经久不衰的老牌fps已经陪伴了我们将近15个年头……治沙技术见证库布其的绿色奇迹来源:人民网国际频道原创稿站在内蒙古鄂尔多斯杭锦旗库布其沙漠沙峰绿谷,危地马拉网红博主塞莉娅大呼:太不可思议了!这里这么多绿色植被,完全不像是在沙漠里!库布其沙漠是……AMD推出GPU比较工具,快速简便地根据游戏需求确定最适合的AMD刚刚推出了其新的GPU比较工具,旨在提供一种快速简便的方法来根据您的游戏需求确定最适合您的显卡。该工具可让您深入了解AMD和Nvidia的几乎所有最佳GPU的性能。……茶叶甜品酒厂漫游京城传统文化体验基地不仅好吃更好玩!富有文化内涵和体验乐趣这样的旅游体验基地谁不心动呢?小北为你介绍几家京城传统文化体验基地在这些地方不仅能满足你当手艺人的愿望更可以品酒吃茶感……最美风景在路上!贵州发布10条自驾旅游路线【来源:多彩贵州网】近日,车窗风景线山地贵州行2022贵州最美风景在路上自驾路线评选活动结束,10条自驾路线从34条参评路线中脱颖而出,成为2022年贵州最美风景在路上自……体育史10大经典宿敌榜单!拳击占两项,C罗VS梅西第2,费纳【文搏击江湖】今天我们介绍体育史上最经典的十大宿敌排行榜,该榜单是一家媒体对2000名成年人观众进行的民意调查得出的结论。当然权威性与否值得商榷。我们权当节日放松了。该榜单按照……雷军大开杀戒,就连小米13也没有秘密了,定档11月见在上半年小米一言不发,而在下半年势必会成为它的主场,机海战术又将被雷军展现得淋漓尽致,米粉们就等着看好戏吧!定会让你挑得眼花缭乱。就目前来说,小米新机曝光的已经不止一两款……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网