`
zhaohaolin
  • 浏览: 1029192 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JVM GC调整优化过程全揭秘

    博客分类:
  • JVM
阅读更多

JVM GC调整优化是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接 受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的JVM GC种类也会不同。接下来,我简单介绍一下如何进行JVM GC调整优化。

首先说一下如何监视JVM GC,你可以使用我以前文章中提到的JDK中的jstat工具,也可以在java程序启动的opt里加上如下几个参数(注:这两个参数只针对SUN的HotSpotVM):

  1. -XX:-PrintGCPrintmessagesatgarbagecollection.Manageable.  
  2. -XX:-PrintGCDetailsPrintmoredetailsatgarbagecollection.Manageable.(Introducedin1.4.0.)  
  3. -XX:-PrintGCTimeStampsPrinttimestampsatgarbagecollection.Manageable(Introducedin1.4.0.) 

当把-XX:-PrintGCDetails加入到javaopt里以后可以看见如下输出:

[GC[DefNew:34538K->2311K(36352K),0.0232439secs]45898K->15874K(520320K),0.0233874secs]
[FullGC[Tenured:13563K->15402K(483968K),0.2368177secs]21163K->15402K(520320K),[Perm:28671K->28635K(28672K)],0.2371537secs]

他们分别显示了JVM GC的过程,清理出了多少空间。第一行GC使用的是‘普通GC’(MinorCollections),第二行使用的是‘全GC’ (MajorCollections)。他们的区别很大,在第一行最后我们可以看见他的时间是0.0233874秒,而第二行的FullGC的时间是 0.2371537秒。第二行的时间是第一行的接近10倍,也就是我们这次调优的重点,减少FullGC的次数,以为FullGC会暂停程序比较长的时 间,如果FullGC的次数比较多。程序就会经常性的假死。当然这只是他们的表面现象,接下来我仔细介绍一下GC,和FullGC(为后面的调优做准 备)。

我们知道Java和C++的区别主要是,Java不需要像c++那样,由程序员主动的释放内存。而是由JVM里的 GC(GarbageCollection)来,在适当的时候替我们释放内存。JVM GC调整优化的内部工作,即JVM GC的算法有很多种,如:标记清除收集器,压缩收集器,分代收集器等等。现在比较常用的是分代收集(也是SUNVM使用的),即将内存分为几个区域,将不 同生命周期的对象放在不同区域里(新的对象会先生成在Youngarea,在几次GC以后,如过没有收集到,就会逐渐升级到Tenuredarea)。在 JVM GC收集的时候,频繁收集生命周期短的区域(Youngarea),因为这个区域内的对象生命周期比较短,GC效率也会比较高。而比较少的收集生命周期比 较长的区域(OldareaorTenuredarea),以及基本不收集的永久区(Permarea)。

注:Youngarea又分为三个区域分别叫Eden,和俩个Survivorspaces。Eden用来存放新的对象,Survivorspaces用于新对象升级到Tenuredarea时的拷贝。

我们管收集生命周期短的区域(Youngarea)的收集叫GC,而管收集生命周期比较长的区域(OldareaorTenuredarea)的收集叫FullGC,因为他们的收集算法不同,所以使用的时间也会不同。我们要尽量减少FullGC的次数。

接下来介绍一下HotSpotVMGC的种类,GC在HotSpotVM5.0里有四种。一种是默认的叫serialcollector,另外几种 分别叫 throughputcollector,concurrentlowpausecollector,incremental(sometimescalledtrain)lowpausecollector(废 弃掉了)。以下是SUN的官方说明:

1.Thethroughputcollector:thiscollectorusesaparallelversionoftheyounggenerationcollector.Itisusedifthe-XX:+UseParallelGCoptionispassedonthecommandline.Thetenuredgenerationcollectoristhesameastheserialcollector.

2.Theconcurrentlowpausecollector:thiscollectorisusedifthe-Xincgc™or-XX:+UseConcMarkSweepGCispassedonthecommandline.Theconcurrentcollectorisusedtocollectthetenuredgenerationanddoesmostofthecollectionconcurrentlywiththeexecutionoftheapplication.Theapplicationispausedforshortperiodsduringthecollection.Aparallelversionoftheyounggenerationcopyingcollectorisusedwiththeconcurrentcollector.Theconcurrentlowpausecollectorisusediftheoption-XX:+UseConcMarkSweepGCispassedonthecommandline.

3.Theincremental(sometimescalledtrain)lowpausecollector:thiscollectorisusedonlyif-XX:+UseTrainGCispassedonthecommandline.ThiscollectorhasnotchangedsincetheJ2SEPlatformversion1.4.2andiscurrentlynotunderactivedevelopment.Itwillnotbesupportedinfuturereleases.Pleaseseethe1.4.2GCTuningDocumentforinformationonthiscollector.

简单来说就是throughputcollector和concurrentlowpausecollector:使用多线程的方式,利用多CUP 来提高GC的效率,而throughputcollector与concurrentlowpausecollector的去别是 throughputcollector只在youngarea使用使用多线程,而concurrentlowpausecollector则在 tenuredgeneration也使用多线程。

根据官方文档,他们俩个需要在多CPU的情况下,才能发挥作用。在一个CPU的情况下,会不如默认的serialcollector,因为线程管理 需要耗费CPU资源。而在两个CPU的情况下,也挺高不大。只是在更多CPU的情况下,才会有所提高。当然 concurrentlowpausecollector有一种模式可以在CPU较少的机器上,提供尽可能少的停顿的模式,见下文。

当要使用throughputcollector时,在javaopt里加上-XX:+UseParallelGC,启动throughputcollector收集。也可加上-XX:ParallelGCThreads=来改变线程数。还有两个参数-XX:MaxGCPauseMillis=和-XX:GCTimeRatio=,MaxGCPauseMillis=用来控制最大暂停时间,而-XX:GCTimeRatio可以提高GC说占CPU的比,以最大话的减小heap。

当要使用concurrentlowpausecollector时,在java的opt里加上-XX:+UseConcMarkSweepGC。 concurrentlowpausecollector还有一种为CPU少的机器准备的模式,叫Incrementalmode。这种模式使用一个 CPU来在程序运行的过程中GC,只用很少的时间暂停程序,检查对象存活。

在Incrementalmode里,每个收集过程中,会暂停两次,第二次略长。第一次用来,简单从root查询存活对象。第二次用来,详细检查存活对象。整个过程如下:

  1. *stopallapplicationthreads;dotheinitialmark;resumeallapplicationthreads(第一次暂停,初始话标记)  
  2. *dotheconcurrentmark(usesoneprocesorfortheconcurrentwork)(运行是标记)  
  3. *dotheconcurrentpre-clean(usesoneprocessorfortheconcurrentwork)(准备清理)  
  4. *stopallapplicationthreads;dotheremark;resumeallapplicationthreads(第二次暂停,标记,检查)  
  5. *dotheconcurrentsweep(usesoneprocessorfortheconcurrentwork)(运行过程中清理)  
  6. *dotheconcurrentreset(usesoneprocessorfortheconcurrentwork)(复原) 

当要使用Incrementalmode时,需要使用以下几个变量:

  1. -XX:+CMSIncrementalModedefault:disabled启动i-CMS模式(mustwith-  
  2.  
  3. XX:+UseConcMarkSweepGC)  
  4. -XX:+CMSIncrementalPacingdefault:disabled提供自动校正功能  
  5. -XX:CMSIncrementalDutyCycle = default :50启动CMS的上线  
  6. -XX:CMSIncrementalDutyCycleMin = default :10启动CMS的下线  
  7. -XX:CMSIncrementalSafetyFactor = default :10用来计算循环次数  
  8. -XX:CMSIncrementalOffset = default :0最小循环次数(Thisisthepercentage(0-  
  9.  
  10. 100)bywhichtheincrementalmodedutycycleisshiftedtotherightwithintheperiod  
  11.  
  12. betweenminorcollections.)  
  13. -XX:CMSExpAvgFactor = default :25提供一个指导收集数 

SUN推荐的使用参数是:

  1. -XX:+UseConcMarkSweepGC\  
  2. -XX:+CMSIncrementalMode\  
  3. -XX:+CMSIncrementalPacing\  
  4. -XX:CMSIncrementalDutyCycleMin = 0 \  
  5. -XX:CMSIncrementalDutyCycle = 10 \  
  6. -XX:+PrintGCDetails\  
  7. -XX:+PrintGCTimeStamps\  
  8. -XX:-TraceClassUnloading 

注:如果JVM GC中使用throughputcollector和concurrentlowpausecollector,这两种垃圾收集器,需要适当的挺高内存大小,以为多线程做准备。JVM GC调整优化到此结束。

分享到:
评论

相关推荐

    揭秘Java虚拟机-JVM设计原理与实现

    10. **性能优化**:通过分析JVM的各种监控工具(如JConsole、VisualVM等),学习如何定位性能瓶颈并进行调优,包括堆大小调整、垃圾收集器选择、JVM参数设置等。 通过阅读这本书,开发者不仅能理解JVM的基本运作...

    揭秘java虚拟机

    通过调整JVM参数,如堆大小、新生代和老年代的比例、GC策略等,可以改善应用程序的性能。理解和掌握JVM性能监控工具,如VisualVM、JConsole、JProfiler等,能够帮助我们有效地定位和解决性能问题。 总之,《揭秘...

    java performance

    - 垃圾收集机制的工作原理,如标记-清除、复制、标记-整理和分代收集算法,以及如何调整GC参数以优化性能。 2. **JVM调优**: - 如何使用JVM工具(如JVisualVM、JProfiler)进行性能分析,包括CPU剖析、内存泄漏...

    程序员的面试模板及技巧资料.pdf,这是一份不错的文件

    - **垃圾回收(GC)**: 了解不同类型的GC(Minor GC, Full GC, CMS, G1等),GC的工作原理,以及如何优化内存管理。 - **JVM内存模型**: 包括堆内存、栈内存、方法区、本地方法栈等区域的用途和大小调整。 3. **...

    基于openocd开源工具实现的C#桌面应用工具

    基于openocd开源工具实现的C#桌面应用工具

    精品-2025人工智能神经网络基本原理解析.pdf

    精品-2025人工智能神经网络基本原理解析.pdf

    施耐德ATV312变频器通过MCGS RTU通讯实现双机监控与控制的触摸屏集成解决方案,无PLC的施耐德ATV312变频器通讯示例:触摸屏控制监控两台变频器,功能多且省成本,改进型可调整步长 P&O

    施耐德ATV312变频器通过MCGS RTU通讯实现双机监控与控制的触摸屏集成解决方案,无PLC的施耐德ATV312变频器通讯示例:触摸屏控制监控两台变频器,功能多且省成本,改进型可调整步长 P&O MPPT(二区MPPT复现),光储系统MPPT 直流负载供电的单级离网光伏系统中,降压转器将太阳能光伏阵列和直流负载连接起来,同时确保最大功率点跟踪(MPPT) 和电池充电控制的良好运行。 在MPPT方面,提出了一种改进的自适应步长扰动观测(P&O)方法,以达到不同天气条件下太阳能光伏阵列的实际最大功率点(MPP),同时减少稳态振荡和功率损耗。 此外,电池充电控制侧使用三级充电控制器 (TSCC) 为铅酸电池站充电。 ,改进型P&O; 复现二区MPPT; 光储系统MPPT; 最大功率点跟踪(MPPT); 步长扰动观测; 降压转换器; 太阳能光伏阵列; 电池充电控制; 三级充电控制器(TSCC); 铅酸电池站。,改进型P&O MPPT技术,光储系统高效能量管理

    redis学习脑图笔记

    redis学习脑图笔记

    大创项目_30.zip

    大学生创业项目源码

    Spring Boot企业员工管理系统(包含万字论文+MYSQL)

    Spring Boot企业员工管理系统(包含万字论文+MYSQL)

    【css酷炫效果】纯CSS实现进度条加载动画

    对应博客地址:https://blog.csdn.net/u011561335/article/details/146312389

    ClientB中的资源原本是在App.xaml的Application.Resources添加的,才能被各个页面调用。改为类库后

    相关文章:https://blog.csdn.net/liu_23yanfeng/article/details/146319189

    从春晚看科技技术-陈雄 - 公开版本.pptx

    从春晚看科技技术-陈雄 - 公开版本.pptx

    基于springboot框架的制造装备物联及生产管理ERP系统的设计与实现(Java项目编程实战+完整源码+毕设文档+sql文件+学习练手好项目).zip

    在计算机上安装制造装备物联及生产管理ERP系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,制造装备物联及生产管理ERP系统的有效运用可以帮助管理人员准确快速地处理信息。 制造装备物联及生产管理ERP系统在对开发工具的选择上也很慎重,为了便于开发实现,选择的开发工具为Eclipse,选择的数据库工具为Mysql。以此搭建开发环境实现制造装备物联及生产管理ERP系统的功能。其中管理员管理用户,新闻公告。 制造装备物联及生产管理ERP系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,制造装备物联及生产管理ERP系统都可以轻松应对。 关键词:制造装备物联及生产管理ERP系统;SpringBoot框架,系统分析,数据库设计

    采用springboot框架的基于HTML5的问卷调查系统的设计与实现(Java项目编程实战+完整源码+毕设文档+sql文件+学习练手好项目).zip

    传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,问卷信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的问卷调查系统。 本问卷调查系统分为管理员还有用户两个权限,管理员可以管理用户的基本信息内容,可以管理新闻资讯信息以及新闻资讯的租赁信息,能够与用户进行相互交流等操作,用户可以查看问卷信息,可以查看新闻资讯以及查看管理员回复信息等操作。 该问卷调查系统采用的是WEB应用程序开发中最受欢迎的B/S三层结构模式,使用占用空间小但功能齐全的MySQL数据库进行数据的存储操作,系统开发技术使用到了JSP技术。该问卷调查系统能够解决许多传统手工操作的难题,比如数据查询耽误时间长,数据管理步骤繁琐等问题。总的来说,问卷调查系统性能稳定,功能较全,投入运行使用性价比很高。 关键词:问卷调查系统;MySQL数据库;SSM技术

    VID20250317191237.mp4

    VID20250317191237.mp4

    西门子S7-1511 PLC PID控制阀门开度与模拟量转换-博途WinCC监控画面程序实践,西门子S7-1511 PLC PID控制阀门开度与模拟量转换-博途WinCC监控画面程序实践,matl

    西门子S7-1511 PLC PID控制阀门开度与模拟量转换——博途WinCC监控画面程序实践,西门子S7-1511 PLC PID控制阀门开度与模拟量转换——博途WinCC监控画面程序实践,matlab验证码识别系统,基于数字图像处理实现。 经过对图像的预处理、二值化、区域剪裁、数字定位、模板匹配法识别数字。 有gui界面和测试图像数据集。 ,核心关键词:Matlab验证码识别系统; 数字图像处理; 图像预处理; 二值化; 区域剪裁; 数字定位; 模板匹配法识别; GUI界面; 测试图像数据集。,基于Matlab的数字图像处理验证码识别系统

    VMware虚拟机从下载到安装使用的全流程详解与优化

    内容概要:本文提供了详细的 VMware 虚拟机安装指南,涵盖软件选择(Pro 和 Player 版区别)、安装步骤(适用于 Windows 和 Linux 主机系统)、虚拟机创建以及操作系统安装指导。详细介绍了配置虚拟机的各项关键设置,如资源分配、硬件参数定制、安装 VMware Tools 提升虚拟机性能和稳定性。并且列出了快照、克隆等高级功能的具体应用,还包括共享文件夹配置和几种常见错误的排除解决方案。 适合人群:初次接触虚拟化的用户和对虚拟环境搭建有一定兴趣的技术爱好者。 使用场景及目标:帮助用户快速部署自己的虚拟机,并掌握虚拟环境中常见的配置技巧,能够针对具体应用场景灵活地调整虚拟机的相关参数,提高工作效率,满足测试、学习、开发的需求。 其他说明:提供了一些安装过程可能遇到的问题及对应解决方案,在创建和维护过程中给予指导性的意见来确保用户的使用体验尽可能顺畅无阻,并给出了部分性能优化建议。

    Matlab开发初学者视频教程.zip

    Matlab开发初学者视频教程,零基础入门,非常适合初学者。

Global site tag (gtag.js) - Google Analytics