首页 > 其他分享 >JVM常用调优参数

JVM常用调优参数

时间:2022-12-21 18:24:04浏览次数:48  
标签:收集器 标记 XX 调优 参数 垃圾 JVM CMS

目录

JVM内存模型及常用参数

参数解释

  1. -XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5
  2. -XX:TargetSurvivorRatio:对象动态年龄判断:当前放对象的Survivor区域中一批对象的总大小大于这块Survivor区域内存大小的50%,那么此时大于等于这批对象年龄最大值的对象,就可以直接进入老年代了
  3. -XX:-HandlerPromotionFailure:老年代空间分配担保机制:Minor GC后JVM会算一下老年代剩余的可用空间。如果可用空间小于年轻代中所有对象大小之和(包括垃圾对象)。则会看是否设置了-XX:-HandlerPromotionFailure(1.8默认设置了)参数

垃圾收集器

Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)

  • 新生代采用复制算法,老年代采用标记-整理算法

Parallel Scavenge收集器(-XX:+UseParallelGC -XX:+UseParallelOldGC)

  • Parallel收集器其实就是Serial收集器的多线程版本
  • Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值
  • 新生代采用复制算法,老年代采用标记-整理算法

ParNew收集器(-XX:+UseParNewGC) + CMS收集器(-XX:+UseConcMarkSweepGC)

  • 垃圾收集线程与用户线程(基本上)同时工作
  • 新生代采用复制算法,老年代采用标记-清除算法
  • ParNew:
    • ParNew收集器其实跟Parallel收集器很类似,区别主要在于它可以和CMS收集器配合使用
  • CMS:
    • 优点:
      • 并发收集、低停顿
    • 缺点:
      1. 对CPU资源敏感(会和服务抢资源);
      2. 无法处理浮动垃圾(在并发标记和并发清理阶段又产生垃圾,这种浮动垃圾只能等到下一次gc再清理了);
      3. 它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生,当然通过参数-XX:+UseCMSCompactAtFullCollection可以让jvm在执行完标记清除后再做整理
        执行过程中的不确定性,会存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况,特别是在并发标记和并发清理阶段会出现,一边回收,系统一边运行,也许没回收完就再次触发full gc,也就是"concurrent mode failure",此时会进入stop the world,用serial old垃圾收集器来回收

垃圾回收统计信息

  • -XX:+PrintGC
  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -Xloggc:filename

CMS的相关核心参数

  • -XX:+UseConcMarkSweepGC:启用cms
  • -XX:ConcGCThreads:并发的GC线程数
  • -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)
  • -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一次
  • -XX:CMSInitiatingOccupancyFraction:当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比)
  • -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整
  • -XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,降低CMS GC标记阶段(也会对年轻代一起做标记,如果在minor gc就干掉了很多对垃圾对象,标记阶段就会减少一些标记时间)时的开销,一般CMS的GC耗时 80%都在标记阶段
  • -XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW
  • -XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW

使用CMS后的JVM内存模型及常用参数:

标签:收集器,标记,XX,调优,参数,垃圾,JVM,CMS
From: https://www.cnblogs.com/daheww/p/16996887.html

相关文章

  • java -jar 参数前后位置说明
    springboot项目启动的时候可以直接使用java-jarxxx.jar这样。下面说说参数的一些讲究1.-DpropName=propValue的形式携带,要放在-jar参数前面eg:java-Dxxx=test-Dp......
  • 内存溢出分析工具MAT实战(一)JVM启动参数分析
    在工作的过程中,有时我们会遇到内存溢出的问题,这时候就需要我们有足够的知识积累去解决内存溢出相关问题。本文章是建立在读者了解java的内存结构的基础上。关于内存分析工具......
  • C++函数参数传递的三种方式之 指针传递(地址传递)
    前景提示:因为目前是对C#比较熟悉,而C++基础堪忧,在学习CGAL时,发现CGAL封装的函数体的参数中动不动就出现'&'、'*'这两个字符,接而疑惑于心中油然而生。//函数定义conv......
  • forms组件渲染标签 、forms组件展示信息 、forms组件校验补充、 forms组件参数补充 、
    目录forms组件渲染标签forms组件展示信息forms组件校验补充forms组件参数补充forms组件源码剖析modelform组件django中间件forms组件渲染标签<p>forms组件渲染标签的方式......
  • Systemverilog实现参数化的Round-Robin Arbiter Tree
    本篇内容涉及的rtl代码为开源组织PLUP的commoncell仓库中的源代码,本文只是对其进行些许解读。源码链接如下:[https://github.com/pulp-platform/common_cells/blob/dc5556......
  • jvm内存划分
    首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执......
  • Systemverilog实现参数化的Round-Robin Arbiter Tree
    SystemVerilog#arbiter#round-robin本篇内容涉及的rtl代码为开源组织PLUP的commoncell仓库中的源代码,本文只是对其进行些许解读。源码链接如下:[https://github.com/pu......
  • 互联网应用之传递HTTP参数
    实例说明HTTP是一种网络传输协议,现实中大多数网页都是通过"HTTP://www."的形式实现显示的.再具体应用时,一些需要的数据都是通过参数传递的.和网络HTTP有关的是HTTPproto......
  • Java 特性、三大版本、JDK、JRE、JVM
    Java的特性 简单性面向对象可移植性writeonce,runanywhere高性能分布式动态性通过反射机制多线程安全性异常机制健壮性 *思考?j......
  • Postman核心功能解析-参数化和测试报告
    每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:magetest码同学抖音号:小码哥聊软件测试1.参数化......