JVM调优的ampampquot标准参数ampampquot
【易错问题】MajorGC和FullGC的区别是什么?触发条件呢?
相信大多数人的理解是MajorGC只针对老年代,FullGC会先触发一次MinorGC,不知对否?我参考了R大的分析和介绍,总结了一下相关的说明和分析结论。在基于HotSpotVM的基础角度
针对HotSpotVM的实现,它里面的GC其实准确分类只有两大种:PartialGC(部分回收模式)
PartialGC代表着并不收集整个GC堆的模式YoungGenerationGC(新生代回收模式):它主要是进行回收新生代范围内的内存对象的GC回收器。OldTenuredGenerationGC(老年代回收模式):它主要是针对于回收老年代OldTenuredGeneration范围内的GC垃圾回收器(CMS的ConcurrentCollection是这个模式)。MixedGenerationGC(混合代回收模式):收集整个younggen以及部分oldgen的GC。只有G1有这个模式FullGC(全体回收模式)
FullGC代表着收集整个JVM的运行时堆方法区直接堆外内存的总体范围内。(甚至可以理解为JVM进程范围内的绝大部分范围的数据区域)。
它会涵盖了所有的模式和区域包含:YoungGen(新生代)、TenuredGen(老生代)、PermMetaGen(元空间)(JDK8前后的版本)等全局范围的GC垃圾回收模式。
在一般情况下MajorGC通常是跟FullGC是等价的,收集整个GC堆。但如果从HotSpotVM底层的细节出发,如果再有人说MajorGC的时候一定要问清楚他想要指的是上面的FullGC还是OldTenuredGC。基于最简单的分代式GC策略触发条件是:YoungGC
按HotSpotVM的SerialGC的实现来看,当Younggen中的Eden区分达到阈值(属于一定的百分比进行控制)的时候触发。
注意:YoungGC中有部分存活对象会晋升到OldTenuredGen,所以YoungGC后OldGen的占用量通常会有所升高。触发条件是:FullGC当准备要触发一次YoungGC时,如果发现统计数据说之前YoungOldTenuredGen剩余的空间大,则不会触发YoungGC,而是转为触发FullGC(因为HotSpotVM的GC里,除了CMS的Concurrentcollection之外,其它能收集OldTenuredGen的GC都会同时收集整个GC堆,包括Younggen,所以不需要事先触发一次单独的YoungGC);如果有PermMetagen的话,要在PermMetagen分配空间但已经没有足够空间时,也要触发一次fullGC。System。gc()方法或者HeapDump自带的GC,默认也是触发FullGC。HotSpotVM里其它非并发GC的触发条件复杂一些,不过大致的原理与上面说的其实一样。
注意:ParallelScavenge(XX:UseParallelGC)框架下,默认是在要触发FullGC前先执行一次YoungGC,并且两次GC之间能让应用程序稍微运行一小下,以期降低FullGC的暂停时间(因为youngGC会尽量清理了YoungGen的垃圾对象,减少了FullGC的扫描工作量)。控制这个行为的VM参数是XX:ScavengeBeforeFullGC。触发条件是:ConcurrentGC
ConcurrentGC的触发条件就不太一样。以CMSGC为例,它主要是定时去检查OldGen的使用量,当使用量超过了触发比例就会启动一次CMSGC,对Oldgen做并发收集。GC回收器对应的GC模式列举
在HotspotJVM实现的SerialGC,ParallelGC,CMS,G1GC中大致可以对应到某个YoungGC和OldGC算法组合;SerialGC算法:SerialYoungGCSerialOldGC(实际上它是全局范围的FullGC);ParallelGC算法:ParallelYoungGC非并行的PSMarkSweepGC并行的ParallelOldGC(这俩实际上也是全局范围的FullGC),选PSMarkSweepGC还是ParallelOldGC由参数UseParallelOldGC来控制;CMS算法:ParNew(Young)GCCMS(Old)GC(piggybackonParNew的结果老生代存活下来的object只做记录,不做compaction)FullGCforCMS算法(应对核心的CMSGC某些时候的不赶趟,开销很大);G1GC:YoungGCmixedGC(新生代,再加上部分老生代)FullGCforG1GC算法(应对G1GC算法某些时候的不赶趟,开销很大);GC回收模式的触发总结搞清楚了上面这些组合,我们再来看看各类GC算法的触发条件。简单说,触发条件就是某GC算法对应区域满了,或是预测快满了。比如,各种YoungGC的触发原因都是eden区满了;SerialOldGCPSMarkSweepGCParallelOldGC的触发则是在要执行YoungGC时候预测其promote的object的总size超过老生代剩余size;CMSGC的initialmarking的触发条件是老生代使用比率超过某值;G1GC的initialmarking的触发条件是Heap使用比率超过某值;FullGCforCMS算法和FullGCforG1GC算法的触发原因很明显,就是4。3和4。4的fancy算法不赶趟了,只能全局范围大搞一次GC了(相信我,这很慢!这很慢!这很慢!);【坑点与坑点】XX:DisableExplicitGC与NIO的directmemory的关系
很多人都见过JVM调优建议里使用这个参数,对吧?但是为什么要用它,什么时候应该用而什么时候用了会掉坑里呢?首先,要了解的是这个参数的作用。在OracleSunJDK这个具体实现上,System。gc()的默认效果是引发一次stoptheworld的FullGC,由上面所知就是针对于整个GC堆做内存垃圾收集。再次,如果采用了用了XX:DisableExplicitGC参数后,System。gc()的调用就会变成一个空调用,完全不会触发任何GC(但是函数调用本身的开销还是存在的哦~)。为啥要用这个参数呢?最主要的原因是为了防止某些小白同学在代码里到处写System。gc()的调用而干扰了程序的正常运行吧。有些应用程序本来可能正常跑一天也不会出一次FullGC,但就是因为有人在代码里调用了System。gc()而不得不间歇性被暂停。有些时候这些调用是在某些库或框架里写的,改不了它们的代码但又不想被这些调用干扰也会用这参数。XX:DisableExplicitGC看起来这参数应该总是开着嘛。有啥坑呢?下述三个条件同时满足时会发生的应用本身在GC堆内的对象行为良好,正常情况下很久都不发生FullGC。应用大量使用了NIO的directmemory,经常、反复的申请DirectByteBuffer。使用了XX:DisableExplicitGC。能观察到的现象是:java。lang。OutOfMemoryError:Directbuffermemoryatjava。nio。Bits。reserveMemory(Bits。java:633)atjava。nio。DirectByteBuffer。init(DirectByteBuffer。java:98)atjava。nio。ByteBuffer。allocateDirect(ByteBuffer。java:288)复制代码用一个案例来分析这现象:importjava。nio。;publicclassDisableExplicitGCDemo{publicstaticvoidmain(String〔〕args){for(inti0;i100000;i){ByteBuffer。allocateDirect(128);}System。out。println(Done);}}复制代码
然后编译、运行。javaversionjavaversion1。6。025Java(TM)SERuntimeEnvironment(build1。6。025b06)JavaHotSpot(TM)64BitServerVM(build20。0b11,mixedmode)javacDisableExplicitGCDemo。javajavaXX:MaxDirectMemorySize10mXX:PrintGCXX:DisableExplicitGCDisableExplicitGCDemoExceptioninthreadmainjava。lang。OutOfMemoryError:Directbuffermemoryatjava。nio。Bits。reserveMemory(Bits。java:633)atjava。nio。DirectByteBuffer。init(DirectByteBuffer。java:98)atjava。nio。ByteBuffer。allocateDirect(ByteBuffer。java:288)atDisableExplicitGCDemo。main(DisableExplicitGCDemo。java:6)javaXX:MaxDirectMemorySize10mXX:PrintGCDisableExplicitGCDemo〔GC10996K10480K(120704K),0。0433980secs〕〔FullGC10480K10415K(120704K),0。0359420secs〕Done复制代码可以看到,同样的程序,不带XX:DisableExplicitGC时能正常完成运行,而带上这个参数后却出现了OOM。XX:MaxDirectMemorySize10m限制了DirectByteBuffer能分配的空间的限额,以便问题更容易展现出来。不用这个参数就得多跑一会儿了。循环不断申请DirectByteBuffer但并没有引用,所以这些DirectByteBuffer应该刚创建出来就已经满足被GC的条件,等下次GC运行的时候就应该可以被回收。实际上却没这么简单。DirectByteBuffer是种典型的冰山对象,也就是说它的Java对象虽然很小很无辜,但它背后却会关联着一定量的nativememory资源,而这些资源并不在GC的控制之下,需要自己注意控制好。
对JVM如何使用nativememory不熟悉的同学可以研究一下这篇演讲,WhereDoesAlltheNativeMemoryGo。【盲点问题】DirectByteBuffer的回收问题
OracleSunJDK的实现里,DirectByteBuffer有几处值得注意的地方。DirectByteBuffer没有finalizer,它的nativememory的清理工作是通过sun。misc。Cleaner自动完成的。sun。misc。Cleaner是一种基于PhantomReference的清理工具,比普通的finalizer轻量些。
Acleanertracksareferentobjectandencapsulatesathunkofarbitrarycleanupcode。SometimeaftertheGCdetectsthatacleanersreferenthasbecomephantomreachable,thereferencehandlerthreadwillrunthecleaner。源码注释Generalpurposephantomreferencebasedcleaners。pCleanersarealightweightandmorerobustalternativetofinalization。TheyarelightweightbecausetheyarenotcreatedbytheVMandthusdonotrequireaJNIupcalltobecreated,andbecausetheircleanupcodeisinvokeddirectlybythereferencehandlerthreadratherthanbythefinalizerthread。Theyaremorerobustbecausetheyusephantomreferences,theweakesttypeofreferenceobject,therebyavoidingthenastyorderingproblemsinherenttofinalization。pAcleanertracksareferentobjectandencapsulatesathunkofarbitrarycleanupcode。SometimeaftertheGCdetectsthatacleanersreferenthasbecomephantomreachable,thereferencehandlerthreadwillrunthecleaner。Cleanersmayalsobeinvokeddirectly;theyarethreadsafeandensurethattheyruntheirthunksatmostonce。pCleanersarenotareplacementforfinalization。Theyshouldbeusedonlywhenthecleanupcodeisextremelysimpleandstraightforward。Nontrivialcleanersareinadvisablesincetheyriskblockingthereferencehandlerthreadanddelayingfurthercleanupandfinalization。authorMarkReinholdversionI,E复制代码
OracleSunJDK中的HotSpotVM只会在OldGenGC(FullGCMajorGC或者ConcurrentGC都算)的时候才会对OldGen中的对象做ReferenceProcessing,而在YoungGCMinorGC时只会对YoungGen里的对象做Referenceprocessing。FullGC会对OldGen做Referenceprocessing,进而能触发Cleaner对已死的DirectByteBuffer对象做清理工作。如果很长一段时间里没做过GC或者只做了YoungGC的话则不会在OldGen触发Cleaner的工作,那么就可能让本来已经死了的、但已经晋升到OldGen的DirectByteBuffer关联的NativeMemory得不到及时释放。为DirectByteBuffer分配空间过程中会显式调用System。gc(),以通过FullGC来强迫已经无用的DirectByteBuffer对象释放掉它们关联的nativememory。Thesemethodsshouldbecalledwheneverdirectmemoryisallocatedorfreed。Theyallowtheusertocontroltheamountofdirectmemorywhichaprocessmayaccess。Allsizesarespecifiedinbytes。staticvoidreserveMemory(longsize){synchronized(Bits。class){if(!memoryLimitSetVM。isBooted()){maxMemoryVM。maxDirectMemory();memoryLimitSettrue;}if(sizemaxMemoryreservedMemory){reservedMemorysize;return;}}System。gc();try{Thread。sleep(100);}catch(InterruptedExceptionx){RestoreinterruptstatusThread。currentThread()。interrupt();}synchronized(Bits。class){if(reservedMemorysizemaxMemory)thrownewOutOfMemoryError(Directbuffermemory);reservedMemorysize;}}复制代码总结分析
这几个实现特征使得OracleSunJDK依赖于System。gc()触发GC来保证DirectByteMemory的清理工作能及时完成。
如果打开了XX:DisableExplicitGC,清理工作就可能得不到及时完成,于是就有机会见到directmemory的OOM,也就是上面的例子演示的情况。我们这边在实际生产环境中确实遇到过这样的问题。
如果你在使用OracleSunJDK,应用里有任何地方用了directmemory,那么使用XX:DisableExplicitGC要小心。如果用了该参数而且遇到directmemory的OOM,可以尝试去掉该参数看是否能避开这种OOM。如果担心System。gc()调用造成FullGC频繁,可以尝试下面提到XX:ExplicitGCInvokesConcurrent参数
原文链接:https:juejin。cnpost7177565339801092152
冬日练兵!陆军特战队员开展潜水集训近日,滇西高原气温骤降,陆军第75集团军某特战旅潜水骨干集训依然如期展开。戳图看现场。(林思吉陈诗曼晏恪)更多精彩资讯请在应用市场下载央广网客户端。欢迎提供新闻线索,24小时报料热
兔年撞大运,武汉男子翻新老宅,竟翻出5瓶老茅台,行家估出天价今年注定是不平凡的一年,作为放开后的第一个春节,机票和各大旅游城市逐渐变得火爆,终于可以在休息的时候好好地去领略一下我们祖国的大好河山。虽然心情是欢呼雀跃的,但心里总是有着莫名其妙
男子大半辈子以乞讨为生,事迹轰动朝野,皇帝亲赐黄马褂男子大半辈子以乞讨为生,事迹轰动朝野,皇帝亲赐黄马褂有这样一个乞丐,他胸怀大志创办学堂回馈社会,他受人尊敬。连皇帝听了他的事迹都非常钦佩,还赐予了他黄马褂一件。自古乞丐是遭人唾弃的
1985年,安徽男子信守承诺去战友家尽孝,9年后娶其妹妹为妻1985年3月5日,对于安徽铜陵市太平乡的胡绍栋夫妇来说,是终身难忘的日子,那天胡绍栋看着手里的烈士阵亡通知书,老俩口有种做梦的感觉,他们不愿相信这是事实。当胡绍栋和老伴还沉浸在丧
中证新华社民族品牌工程指数报1856。35点中证网讯(记者王宇露)1月12日,上证指数上涨0。05,深证成指上涨0。23,创业板指上涨0。51,中证新华社民族品牌工程指数(指数代码931403)下跌0。01,报1856。35
狼来了!印度本土iPhone组装厂商已出现是老铁的,关注我的公号虎三专栏!如下截图,据国内新闻,印度最大财团塔塔将收割纬创印度工厂,3月底前拟接管8条iPhone产线。可以说,将来就是富士康与印度塔塔抢苹果的iPhone组
基本确定!中国男篮将征召18人集训,刘炜领衔本土教练辅助乔帅北京时间1月12日,根据篮球记者宋翔的爆料,中国男篮最新一期的男篮集训名单基本上定下来了,大约18人左右,近期就会公布最新集训球员与教练组成员,他们将全力备战接下来的世预赛比赛。据
三大偏僻场景测试折叠屏信号OPPO一枝独秀,华为4G比三星5G强?近年来,智能手机飞速发展,已经成了我们生活中不可或缺的一部分。不过手机也有一个非常关键的地方,那就是信号,即使再贵的手机,出门没有信号也和砖头没什么差别。那么,在如今大热的折叠屏手
相信吧,愉快的日子即将来临头条创作挑战赛小的时候,我们盼着长大,觉得长大后的一切都是那么美好。我们长大了,却发现原来不是我们想象的那样,我们工作了,原来职场也不是我们想象的样子,我们成家了,家也不是我们心中
散文心情染香,日子便有了诗意作者子墨冬日的风景,依旧是简单明了,阳光下,远处的山,也是熠熠生辉,远远看着就很美。天空蔚蓝,飘着几朵白云,淡淡的感觉,是云的飘逸,这种云淡风轻的样子也很美。风滑过岁月的窗,枯干的
心有所信,方能远行心有所信,方能远行,不忘初心牢记使命一个人无论走多远走多久,无论从哪里来到哪里去,都不能忘记自己的初心和使命。心有所信,方能远行中共产党的初心使命就是带领中国人民走向伟大复兴。从风
它是补气血黄金菜,敞开吃润肺养胃俗话说,会吃山药,胜吃补药!神农本草经里说山药味甘温,补虚羸,除寒热邪气!补中,益气力,长肌肉!久服耳目聪明,轻身,不饥,延年!山药还被称为黄金菜,常吃山药,可以细水长流的补气血,
河南商丘市六个旅游景点民权黄河故道国家湿地公园红荷绿藕相间,沙鸥翱翔云集民权黄河故道国家湿地公园位于河南省商丘市民权县东北部6公里处,南北宽3km,东西长30km,总规划面积2303。5公顷,其中湿地面
大城名园万物和谐春意抛来粉绣球,非洲芙蓉倒头开挂来自非洲的吊芙蓉你见过没有?开花时垂着头,像喝醉酒一样,也被称作三醉芙蓉。近日,记者在华南国家植物园木本花卉区和生物园入口处,看见大片非洲芙蓉树正在抱团盛开,聚生的粉红色小花数十朵
公益案鉴规范景区刷脸入园民事公益诉讼案件办理重点及启示规范景区刷脸入园民事公益诉讼案件办理重点及启示何成林浙江省人民检察院二级高级检察官应旭君浙江省人民检察院第八检察部一级检察官助理摘要随着以数字化网络化智能化为特征的智慧旅游产业蓬勃
又一省级风景区来袭!准备好被青绿绝色刷屏日前湖北省水利厅公布了2022年度省级水利风景区名单谷城南河小三峡水利风景区被认定为省级水利风景区谷城南河小三峡水利风景区位于襄阳市谷城县,依托南河水库及庙子头南河电站白水峪3座梯
奔赴山林间一起去寻春时光清浅暖阳融融亲爱的朋友风里已经传来了春的味道山野万万里深藏好风光春行即兴一起奔赴山林饱览无限美景吧2023SPRINGMountain。1泸山西昌市泸山,山峦奇秀,充满灵气,山
随着江夏永旺落地这里也该火了吧!在江夏有一处地方人杰地灵它不像纸坊城区还保留了些许历史的沧桑也不比庙山车水马龙的繁华但在这既能感受灯红酒绿的喧闹又能寻觅街坊邻里间的市井情怀还能感染少年人的青春活力它的名字就叫大花
游古街逛书店品黄梅感受宜城魅力来源人民网安徽频道灯火辉煌的倒扒狮老街。人民网王锐摄人民网安庆2月13日电(王锐)现在到安庆,不逛逛倒扒狮老街那必将是一种遗憾。这是安庆本地人喜欢说的一句话。倒扒狮老街始建于明朝,
太仙啦!福州现实版天空之城来了太仙了!当平流雾与福州邂逅如梦似幻,宛若仙境蔚为壮观这两天的福州化作天空之城罗南军摄罗南军摄罗南军摄石磊磊摄闽侯大湖。尖尖摄雨后初晴的福州宛如山水画作,人间仙境日落时分的榕城给你极
立春后,3种小海鲜正肥美,最低2元一斤,好吃不贵,都是下酒好菜新年美食市集竹外桃花三两枝,春江水暖鸭先知,立春之后正是乍暖还寒时节,不过春回大地,万物复苏的脚步已经不可阻挡,这个时候有很多早春独有的食材都会争先上市,正是尝鲜的好时候。春季里随
35道比肉还好吃的素菜,炒拌烤炖样样有,孩子老人都能吃这几天在公司,我发现同事们带的饭,从刚开始上班那一周每天都是过年剩的大鱼大肉,变成了各种清淡的素菜。不用问也能猜到,是真吃不动了除了我的同事们,后台也有好多朋友留言,想要更多素菜的