面试官:你有没有线上JVM 调优经验

面试官:在工作中做过 JVM 调优吗?讲讲做过哪些 JVM 调优?

我相信这种问题大部分在参加面试的时候都会碰到,但是我们今天讨论一下

JVM 经过这么多年的发展和验证,整体是非常健壮的,个人认为99%的情况下,基本用不到 JVM 调优.

通常情况下我们的jvm参数调优都会遵循官方的建议:

  • XX:NewRatio=2
  • XX:SurvivorRatio=8
  • 堆内存设置为物理内存的3/4左右

JVM 参数的默认(推荐)值都是经过 JVM 团队的反复测试和前人的充分验证得出的比较合理的值,因此通常来说是比较靠谱和通用的,一般不会出大问题.

大部分同学更常遇到的应该是自己的代码 bug 导致 OOM、CPU load高、GC频繁啥的,这些场景也基本都是代码修复即可,通常不需要动 JVM
凡事没有绝对,一些业务还会需要jvm调优的,一般情况下都是参数调优,使其更适合我们的业务.而不是对其源码进行改动.
jvm调优有没有必要,用更好的垃圾回收器能不能解决问题?
  • 关于实战
    • 不考虑应付面试的因素,升级垃圾回收器确实会是最有效的方式之一,比如CMS 升级到 G1,甚至 ZGC。
  • 面试角度
    • 回答直接升级垃圾回收器可能话题就结束了,这样回答不会加分反而会扣分.所以你可以回答升级垃圾回收器,但又不能只回答升级垃圾收集器.
JVM 优化步骤?

对于JVM的核心指标,我们的关注点和常用工具如下:

  1. cpu指标
    • 查看占用CPU最多的进程
    • 查看占用CPU最多的线程
    • 查看线程堆栈快照信息
    • 分析代码执行热点
    • 查看哪个代码占用CPU执行时间最长
    • 查看每个方法占用CPU时间比例
    // 显示系统各个进程的资源使用情况
    top
    // 查看某个进程中的线程占用情况
    top -Hp pid
    // 查看当前 Java 进程的线程堆栈信息
    jstack pid
    
    常见的工具:JProfiler、JVM Profiler、Arthas…
  2. JVM 内存指标
    • 查看当前 JVM 堆内存参数配置是否合理
    • 查看堆中对象的统计信息
    • 查看堆存储快照,分析内存的占用情况
    • 查看堆各区域的内存增长是否正常
    • 查看是哪个区域导致的GC
    • 查看GC后能否正常回收到内存
    // 查看当前的 JVM 参数配置
    ps -ef | grep java
    // 查看 Java 进程的配置信息,包括系统属性和JVM命令行标志
    jinfo pid
    // 输出 Java 进程当前的 gc 情况
    jstat -gc pid
    // 输出 Java 堆详细信息
    jmap -heap pid
    // 显示堆中对象的统计信息
    jmap -histo:live pid
    // 生成 Java 堆存储快照dump文件
    jmap -F -dump:format=b,file=dumpFile.phrof pid
    
  3. JVM GC指标
    • 查看每分钟GC时间是否正常
    • 查看每分钟YGC次数是否正常
    • 查看FGC次数是否正常
    • 查看单次FGC时间是否正常
    • 查看单次GC各阶段详细耗时,找到耗时严重的阶段
    • 查看对象的动态晋升年龄是否正常
      GC日志常用 JVM 参数:
    // 打印GC的详细信息
    -XX:+PrintGCDetails
    // 打印GC的时间戳
    -XX:+PrintGCDateStamps
    // 在GC前后打印堆信息
    -XX:+PrintHeapAtGC
    // 打印Survivor区中各个年龄段的对象的分布信息
    -XX:+PrintTenuringDistribution
    // JVM启动时输出所有参数值,方便查看参数是否被覆盖
    -XX:+PrintFlagsFinal
    // 打印GC时应用程序的停止时间
    -XX:+PrintGCApplicationStoppedTime
    // 打印在GC期间处理引用对象的时间(仅在PrintGCDetails时启用)
    -XX:+PrintReferenceGC
    
在这里我附上自己服务的配置几个参数以及目前的效果图
-Xms1024m 
-Xmx1024m 
-Xmn512m 
-Xss512k
-XX:SurvivorRatio=8 
-XX:+UseConcMarkSweepGC
..

在这里插入图片描述
在这里插入图片描述

解释一下这几个参数含义:

S0C:第一个幸存区的大小
 S1C:第二个幸存区的大小
 S0U:第一个幸存区的使用大小
 S1U:第二个幸存区的使用大小
 EC:伊甸园区的大小
 EU:伊甸园区的使用大小
 OC:老年代大小
 OU:老年代使用大小
 MC:方法区大小
 MU:方法区使用大小
 CCSC:压缩类空间大小
 CCSU:压缩类空间使用大小
 YGC:年轻代垃圾回收次数
 YGCT:年轻代垃圾回收消耗时间
 FGC:老年代垃圾回收次数
 FGCT:老年代垃圾回收消耗时间
 GCT:垃圾回收消耗总时间
jvm参数纵览表
  • JVM参数的含义
参数名称 含义
-Xms 初始堆大小
-Xmx 最大堆大小
-Xmn 年轻代大小
-XX:NewSize 设置年轻代大小
-XX:MaxNewSize 年轻代最大值(for 1.3/1.4)
-XX:PermSize 设置持久代(perm gen)初始值
-XX:MaxPermSize 设置持久代最大值
-Xss 每个线程的堆栈大小
-XX:ThreadStackSize Thread Stack Size
-XX:NewRatio 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久
-XX:SurvivorRatio Eden区与Survivor区的大小比值
-XX:LargePageSizeInBytes 内存页的大小不可设置过大, 会影响Perm的大小
-XX:+UseFastAccessorMethods 原始类型的快速优化
-XX:+DisableExplicitGC 关闭System.gc()
-XX:MaxTenuringThreshold 垃圾最大年龄
-XX:+AggressiveOpts 加快编译
-XX:+UseBiasedLocking 锁机制的性能改善
-Xnoclassgc 禁用垃圾回收
-XX:SoftRefLRUPolicyMSPerMB 每兆堆空闲空间中SoftReference的存活时间
-XX:PretenureSizeThreshold 对象超过多大是直接在旧生代分配
-XX:TLABWasteTargetPercent TLAB占eden区的百分比
-XX:+CollectGen0First FullGC时是否先YGC
  • 并行收集器相关参数
名称 含义
-XX:+UseParallelGC Full GC采用parallel MSC
-XX:+UseParNewGC 设置年轻代为并行收集
-XX:ParallelGCThreads 并行收集器的线程数
-XX:+UseParallelOldGC 年老代垃圾收集方式为并行收集
-XX:MaxGCPauseMillis 每次年轻代垃圾回收的最长时间
-XX:+UseAdaptiveSizePolicy 自动选择年轻代区大小和相应的Survivor区比例
-XX:GCTimeRatio 设置垃圾回收时间占程序运行时间的百分比
-XX:+ScavengeBeforeFullGC Full GC前调用YGC
  • CMS相关参数
名称 含义
-XX:+UseConcMarkSweepGC 使用CMS内存收集
-XX:CMSFullGCsBeforeCompaction 多少次后进行内存压缩
-XX:+CMSParallelRemarkEnabled 降低标记停顿
-XX+UseCMSCompactAtFullCollection 在FULLGC的时候,对年老代的压缩
-XX:+UseCMSInitiatingOccupancyOnly 使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 使用cms作为垃圾回收使用70%后开始CMS收集
-XX:CMSInitiatingPermOccupancyFraction 设置PermGen使用到达多少比率时触发
-XX:+CMSIncrementalMode 设置为增量模式
  • 辅助信息
名称 含义
-XX:+PrintGC 打印gc
-XX:+PrintGCDetails gc详情
-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间.可与上面混合使用
-XX:+PrintGCApplicationConcurrentTime 打印每次垃圾回收前,程序未中断的执行时间.可与上面混合使用
-XX:+PrintHeapAtGC 打印GC前后的详细堆栈信息
-Xloggc:filename 把相关日志信息记录到文件以便分析.与上面几个配合使用
-XX:+PrintClassHistogram garbage collects before printing the histogram.
-XX:+PrintTLAB 查看TLAB空间的使用情况
-XX:+PrintTenuringDistribution 查看每次minor GC后新的存活周期的阈值

猜你喜欢

转载自blog.csdn.net/u011277745/article/details/124727390