浅谈JVM调优

目录

  • 调优目的
  • Arthas
  • 出现的问题
      • 频繁STW
      • STW时间过长
  • 调优参数
      • 堆内存参数
      • 调试跟踪参数设置
      • GC 参数
          • 串行收集器参数
          • 并行收集器参数
          • CMS参数
          • G1参数

先了解JVM内存模型、工作原理、垃圾回收 JVM

调优目的

使用较小的内存占用来获得较高的吞吐量或者较低的延迟

吞吐量:用户程序运行时间占用户程序和垃圾收集占用总时间的比值

延迟:减少full gc,减少STW,减少程序暂停,提高性能

调优工具

JDK自带的调优工具:cmd-> jvisualvm

阿里开源调优工具:Arthas

Arthas

下载:https://arthas.gitee.io/arthas-boot.jar

启动:java -jar arthas-boot.jar

运行时会显示所有的进程,选择进程就会监控该进程

输入命令dashboard:打开进程仪表盘,就可以查看当前进程状态

浅谈JVM调优_第1张图片

  1. 一个线程长期占用大量cpu资源:thread 线程id:找出cpu占用高的代码位置

  2. 线程持续阻塞:可能死锁:输入命令 thread -b:找出死锁位置

  3. jad加全类名:代码反编译,可看上线代码是否正常

  4. ognl:可看上线系统变量的值,也可以修改值

    浅谈JVM调优_第2张图片

出现的问题

电商平台,大流量高并发,订单对象–数量大,用时短

频繁STW

老年代增长过快,很快就满,2、3存的可能都是垃圾

  1. 分代年龄大于15
  2. 新增对象时发生minor gc
  3. 幸存者区装不下

解决:增加新生代比例

STW时间过长

内存区域分配大,垃圾收集是STW时间就很长,客户端会卡顿,以为服务器没有接收请求,就会重新发送,导致问题

如果新生代分配内存过大也会出现卡顿时间长的情况

调优参数

-Xmx4g –Xms4g –Xmn1200m –Xss512k -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=100m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15

堆内存不足

调整最大大堆内存和初始化堆内存的大小: -Xmx–Xms

提高并发性能

降低每个线程的堆栈大小 –Xss ,减小这个值能生成更多的线程,不能太小,栈会溢出

对象在年轻代的存活时间

-XX:MaxTenuringThreshold,默认15也是最大的

小了:频繁full gc

大了:复制太多次,减少性能

CMS垃圾回收器并行线程数

enuringThreshold,默认15也是最大的

小了:频繁full gc

大了:复制太多次,减少性能

CMS垃圾回收器并行线程数

-XX:ConcGCThreads=4:CMS垃圾回收器并行线程线,推荐值为CPU核心数

堆内存参数

-Xms10g :JVM启动时申请的初始堆内存值
-Xmx20G :JVM可申请的最大Heap值
-Xmn3g : 新生代大小,一般设置为堆空间的1/3 1/4左右,新生代大则老年代小
-Xss :Java每个线程的Stack大小
-XX:PermSize :持久代(方法区)的初始内存大小
-XX:MaxPermSize : 持久代(方法区)的最大内存大小
-XX:SurvivorRatio : 设置新生代eden空间和from/to空间的比例关系,关系(eden/from=eden/to)
-XX:NewRatio : 设置新生代和老年代的比例老年代/新生代

调试跟踪参数设置

-XX:+PrintGC :打印GC日志
-XX:+PrintGCDetailsGC :时的详细堆信息
-XX:+PrintHeapAtGC :打印GC前后的堆信息
-XX:+PrintGCTimeStamps :输出GC发生时间,输出的时间为虚拟机启动的偏移量
-XX:+PrintGCApplicationConcurrentTime :输出应用程序执行时间
-XX:+PrintGCApplicationStoppedTime :输出应用程序由于GC产生停顿的时间
-XX:+PrintRefrenceGC :输出软引用、弱引用、虚引用和Finalize队列
-XX:+HeapDumpOnOutOfMemoryError :产生OOM时可以在内存溢出时导出整个堆信息
-XX:HeapDumpPath :导出堆文件存放路径
-XX:+TraceClassLoading :跟踪类加载信息
-XX:+TraceClassUnloading :跟:踪类卸载信息
-XX:PrintClassHitogram :查看系统中的类的分布情况(占用空间最多、实例数量空间大小)
-XX:+PrintVMOptions :打印虚拟机接收到的命令行显示参数
-XX:+PrintCommandLineFlags :打印虚拟机的显式和隐式参数
-XX:+PrintFlagsFinal :打印虚拟机的所有系统参数

GC 参数

串行收集器参数
-XX:+UseSerialGC :新生代、老年代使用串行收集器
-XX:SurvivorRatio :设置eden区和survivor区大小的比例
-XX:PretenureSizeThreshold,:当对象大小超过此值时,直接分配到老年代
-XX:MaxTenuringThreshold :设置对象进入老年代的最大年龄
并行收集器参数
-XX:+UseParNewGC :新生代使用并行收集器
-XX:+UseParallelOldGC :老年代使用并行回收收集器
-XX:+ParallelGCThreads :设置垃圾回收线程数,一般最好与CPU数量相当,默认情况下,当CPU数量小于8个时,ParallelGCThreads的值相当于CPU数量,当CPU数量大于8个时,ParallelGCThreads的值等于3+((5*CPU_COUNT)/8
-XX:MaxGCPauseMillis :设置最大垃圾收集停顿时间
-XX:GCTimeRatio :设置吞吐量大小,它的值是一个0~100之间的整数,假设值为n,那么系统将花费不超过1/(1+n)的时间用于垃圾收集
-XX:+UseAdaptiveSizePolicy :打开自适应GC策略,JVM对新生代的大小、eden和survivior的比例、晋升老年代对象年龄等参数自动调整
CMS参数
-XX:+UseConcMarkSweepGC :启用CMS
-XX:ParallelCMSThreads :设置CMS线程数量
-XX:CMSInitiatingOccupancyFraction :默认68当老年代的空间超过68%时会执行一次CMS回收
-XX:UseCMSCompactAtFullCollection :设置CMS结束后是否需要进行一次内存空间整理
-XX:CMSFullGCsBeforeCompaction :进行多少次CMS后进行内存空间压缩
-XX:+CMSClassUnloadingEnabled :允许对类元数据区进行回收
-XX:CMSInitiatingPermOccupancyFraction :当永久区占用率达到此值时进行CMS回收(须激活CMSClassUnloadingEnabled)
-XX:UseCMSInitiatingOccupancyOnly:只要达到阈值时进行CMS回收
G1参数
-XX:MaxGCPauseMillis :最大垃圾收集停顿时间
-XX:GCPauseIntervalMillis :最大停顿间隔时间

你可能感兴趣的:(advance,java,JVM,调优)