JVM堆内存很富足时,为啥经常连续发生两次full GC

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM堆内存很富足时,为啥经常连续发生两次full GC相关的知识,希望对你有一定的参考价值。

参考技术A 前面我自理解面复制java垃圾收前听师讲像内存满才做整体垃圾收,收垃圾同调用finalize.构造类构造类覆盖finalize便于该类垃圾收执行些代码,比释放资源.1.JVMgc概述 gc即垃圾收集机制指jvm用于释放些再使用象所占用内存java语言并要求jvmgc没规定gc何工作用jvm都gc且数gc都使用类似算管理内存执行收集操作 充理解垃圾收集算执行程才能效优化性能些垃圾收集专用于特殊应用程序比实应用程序主要避免垃圾收集断数OLTP应用程序则注重整体效率理解应用程序工作负荷jvm支持垃圾收集算便进行优化配置垃圾收集器 垃圾收集目于清除再使用象gc通确定象否象引用确定否收集该象gc首先要判断该象否候收集两种用引用计数象引用遍历 1.1.引用计数 引用计数存储特定象所引用数说应用程序创建引用及引用超范围jvm必须适增减引用数某象引用数0便进行垃圾收集 1.2.象引用遍历 早期jvm使用引用计数现数jvm采用象引用遍历象引用遍历组象始沿着整象图每条链接递归确定达(reachable)象某象能些根象(至少)达则作垃圾收集象遍历阶段gc必须记住哪些象达便删除达象称标记(marking)象 步gc要删除达象删除些gc简单扫描堆栈删除未标记未标记象并释放内存新象叫做清除(sweeping)种问题于内存段足用于新象组合起却许gc重新组织内存象并进行压缩(compact)形利用空间 gc需要停止其种意味着所与应用程序相关工作停止gc运行结响应期间增减许混杂请求另外更复杂 gc断增加或同运行减少或者清除应用程序断gc使用单线程完项工作则采用线程增加效率2.几种垃圾收机制 2.1.标记-清除收集器 种收集器首先遍历象图并标记达象扫描堆栈寻找未标记象并释放内存种收集器般使用单线程工作并停止其操作 2.2.标记-压缩收集器 叫标记-清除-压缩收集器与标记-清除收集器相同标记阶段第二阶段则标记象复制堆栈新域便压缩堆栈种收集器停止其操作 2.3.复制收集器 种收集器堆栈两域称半空间每仅使用半空间jvm新象则放另半空间gc运行达象复制另半空间压缩堆栈种适用于短存期象持续复制存期象则导致效率降低 2.4.增量收集器 增量收集器堆栈域每仅域收集垃圾造较应用程序断 2.5.代收集器 种收集器堆栈两或域用存放同寿命象jvm新象般放其某域段间继续存象获使用期并转入更寿命域代收集器同域使用同算优化性能 2.6.并发收集器 并发收集器与应用程序同运行些收集器某点(比压缩)般都停止其操作完特定任务其应用程序进行其台操作所断其处理实际间降低 2.7.并行收集器 并行收集器使用某种传统算并使用线程并行执行工作cpu机器使用线程技术显著提高java应用程序扩展性3.Sun HotSpot 1.4.1 JVM堆调整 Sun HotSpot 1.4.1使用代收集器堆三主要域:新域、旧域及永久域Jvm所新象放新域旦象经历定数量垃圾收集循环便获使用期并进入旧域永久域jvm则存储classmethod象配置言永久域独立域并且认堆部 面介绍何控制些域使用-Xms-Xmx 控制整堆原始或值 面命令初始设置128M: java –Xms128m –Xmx256m控制新域使用-XX:NewRatio设置新域堆所占比例 面命令整堆设置128m新域比率设置3即新域与旧域比例1:3新域堆1/4或32M:java –Xms128m –Xmx128m–XX:NewRatio =3使用-XX:NewSize-XX:MaxNewsize设置新域初始值值 面命令新域初始值值设置64m:java –Xms256m –Xmx256m –Xmn64m 永久域默认4m运行程序jvm调整永久域满足需要每调整jvm堆进行完全垃圾收集 使用-XX:MaxPerSize标志增加永久域搭WebLogic Server应用程序加载较类经需要增加永久域值jvm加载类永久域象急剧增加使jvm断调整永久域避免调整使用-XX:PerSize标志设置初始值 面永久域初始值设置32m值设置64mjava -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m 默认状态HotSpot新域使用复制收集器该域般三部第部Eden用于新象另两部称救助空间Eden 充满收集器停止应用程序所达象复制前from救助空间旦前from救助空间充满收集器则达象复制前to救助空间Fromto救助空间互换角色维持象救助空间断复制直获使用期并转入旧域使用-XX:SurvivorRatio 控制新域空间 同NewRationSurvivorRation规定某救助域与Eden空间比值比命令新域设置64mEden占32m每救助域各占16m:java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2 前所述默认状态HotSpot新域使用复制收集器旧域使用标记-清除-压缩收集器新域使用复制收集器意义应用程序部象短寿命理想状态所渡象移Eden空间收集能够并且移Eden空间象寿命理论立即移进旧域避免救助空间反复复制应用程序能适合种理想状态部寿命象保持些寿命象并放新域复制部象总比压缩旧域廉价控制新域象复制用-XX:TargetSurvivorRatio控制救助空间比例(该值设置救助空间使用比例救助空间位1M该值50表示用500K)该值百比默认值50较堆栈使用较低 sruvivorratio应增加该值80至90更利用救助空间用-XX:maxtenuring threshold控制限 放置所复制全部发及希望象eden扩展旧域MaxTenuring Threshold设置0设置完实际再使用救助空间应SurvivorRatio设值化Eden空间设置:java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000 …4.BEA JRockit JVM使用 Bea WebLogic 8.1使用新JVM用于Intel平台Bea安装完毕目录看类似于jrockit81sp1_141_03文件夹 Bea新JVM所目录同于HotSpotJava字节码编译本码预先编译类JRockit提供更细致功能用观察JVM运行状态主要独立GUI控制台(能适用于使用Jrockit才能使用jrockit81sp1_141_03自带console监控些cpu及 memory参数)或者WebLogic Server控制台 Bea JRockit JVM支持4种垃圾收集器: 4.1.1.代复制收集器 与默认代收集器工作策略类似象新域配即JRockit文档nursery种收集器适合单cpu机型堆操作 4.1.2.单空间并发收集器 该收集器使用完整堆并与背景线程共同工作尽管种收集器消除断收集器需花费较间寻找象且处理应用程序收集器经运行处理器能应付应用程序产垃圾断应用程序并关闭收集 代并发收集器种收集器护理域使用排复制收集器旧域则使用并发收集器由于比单空间共同发收集器断频繁需要较少内存应用程序运行效率较高注意护理域导致量临象扩展旧域造收集器超负荷运作甚至采用排性工作式完收集 4.1.3.并行收集器 该收集器停止其进程工作使用线程加速收集进程尽管比其收集器易于引起间断般能更利用内存程序效率较高 默认状态JRockit使用代并发收集器要改变收集器使用-Xgc:应四收集器别 gencopysinglecongencon及parallel使用-Xms-Xmx设置堆初始值要设置护理域则使用- Xns:java –jrockit –Xms512m –Xmx512m –Xgc:gencon –Xns128m…尽管JRockit支持-verbose:gc关输信息收集器同异JRockit支持memory、 loadcodegen输 注意 : 使用JRockit JVM使用WLS自带console(C:\bea\jrockit81sp1_141_03\bin)监控些数据cpu memery等要想能构监控必须启服务startWeblogic.cmd加入-Xmanagement参数5.何JVM获取信息进行调整 -verbose.gc关显示gc操作内容打显示忙空闲收集行发间、收集前内存、收集需要间等打- xx:+ printgcdetails关详细解gc变化打-XX: + PrintGCTimeStamps关解些垃圾收集发间自jvm启秒计量通-xx: + PrintHeapAtGC关解堆更详细信息解新域情况通-XX:=PrintTenuringDistribution关解获使用期象权6.Pdm系统JVM调整 6.1.服务器:前提内存1G 单CPU 通参数进行调整:-server 启用服务器模式(CPU服务器机建议使用项) -Xms,-Xmx般设同 800m -Xmn NewSize与MaxNewSize设致320m -XX:PerSize 64m -XX:NewSize 320m 值设调新象区减少Full GC数 -XX:MaxNewSize 320m -XX:NewRato NewSize设设 -XX: SurvivorRatio -XX:userParNewGC 用设置并行收集 -XX:ParallelGCThreads 用增加并行度 -XXUseParallelGC 设置使用并行清除收集器 -XX:UseAdaptiveSizePolicy 与面联合使用效更利用自优化新域及救助空间比值 6.2.客户机:通JNLP文件设置参数调整客户端JVM JNLP参数:initial-heap-sizemax-heap-size frameworkRequestManagerJNLP文件加入述参数些值要求根据客户机硬件状态变化(客户机内存等)建议两参数值设客户机用内存60%(待测试)态JNLP两参数值能够随客户机同同靠虑获客户机系统信息并些嵌首页index.jsp作连接请求参数 设置述参数通Visualgc 观察垃圾收些参数状态再做相应调整改善性能般标准减少fullgc数硬件支持使用并行垃圾收(要求CPU)

JVM内存区域划分总结

发现网上有两个版本的JVM内存划分,一个是按照《深入理解JVM虚拟机》上的版本,包含程序计数器等,按照是否线程共享划分。

另一个我觉得更好记一些,也更适合我自己,在这里记录一下。

首先上思维导图:

技术图片

一个个来说道吧。

堆内存 heap

堆内存主要被划分为新生代和老年代(差不多的意思)

基本上所有对象实例都在堆中创建,因此堆内存经常发生GC回收操作。新的对象首先分配在Eden区,两个Surviior区仅作为Eden区的缓冲使用。每次GC回收一次,对象的age值就+1,当Survivor区对象age值大于15时(默认,可更改:-XX:MaxTenuringThreshold),就被转移到老年代。

新生代下又划分为三个区,即Eden Space,To Survivor ,From Survivor。新生代占用堆内存的1/3,而三个区的内存占用情况如下图:

技术图片

 

 JVM默认Yong和Old分配比例为1:2,即新生代的内存大小为堆内存的1/3。

调整参数:–XX:NewRatio

而新生代中,Eden、from、to的默认比例为8:1:1,JVM每次只会使用一块Survivor区来为对象服务,所以,不论何时,都存在一个空闲的Survivor区域

调整参数:–XX:SurvivorRatio 

 

老年代的内存大小为剩下的2/3

 

以上是关于JVM堆内存很富足时,为啥经常连续发生两次full GC的主要内容,如果未能解决你的问题,请参考以下文章

触发JVM进行Full GC的情况及应对策略

JVM调优—内存区域

图解带你掌握`JVM`运行时核心内存区

JVM内存区域划分总结

JVM运行时数据区--堆

技术侦探日记 01 - FULL GC篇