jvm重要参数可视化和线上问题排查

jvm重要参数可视化和线上问题排查

目标

  • 熟悉常用的 jvm参数 含义,默认值
  • 了解配置这些默认值的一般原则
  • 线上排查内存溢出的步骤和常见原因分析

jvm参数

分类(了解)

  • 根据jvm参数开头可以区分参数类型,共三类:--X-XX
  • 标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容
  • 非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容
    • 例子:Xms20m,-Xmx20m,-Xmn20m
  • 非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
    • 例子:-XX:+PrintGCDetails,-XX:-UseParallelGC,-XX:+PrintGCTimeStamps

运行时数据区相关的(jdk1.8)

  1. 程序计数器(无参数)
  2. 虚拟机栈(本地方法栈)
    • -Xss: stack size 设置每个线程的栈大小,等同于 -XX:ThreadStackSize
  3. 方法区(元空间)
    • -XX:MetaspaceSize: 设置 Metaspace 的初始(和最小大小)
    • -XX:MaxMetaspaceSize: 设置 Metaspace 的最大大小
    • 1.8 之前使用
      • -XX:PermSize
      • -XX:MaxPermSize
    • 求和
      • 堆内存 = 新生代(Young Generation) + 老年代() ; 新生代 = Eden + S0 + S1
    • -Xms: memory size 设置jvm初始化堆大小
    • -Xmx: memory max 设置jvm初始化堆最大值,等同于 -XX:MaxHeapSize
    • -XX:NewRatio: 设置 新生代 和 老年代 的比例
    • 新生代
      • -XX:SurvivorRatio: 设置 新生代内部的 比例
      • 一共有两种指定 新生代内存(Young Generation)大小的方法
        • 通过 -XX:NewSize-XX:MaxNewSize 指定 初始值和最大值
        • 通过 -Xmn memory new 设置新生代大小,NewSize 与 MaxNewSize 设为一致
    • 老年代
      • -XX:MaxTenuringThreshold: 新生代中对象存活次数,默认15。(若对象在eden区,经历一次MinorGC后还活着,则被移动到Survior区,年龄加1。以后,对象每次经历MinorGC,年龄都加1。达到阀值,则移入老年代)

处理 OOM 相关的

  • 线上环境比配,方便分析内存溢出
    • -XX:+HeapDumpOnOutOfMemoryError
    • -XX:HeapDumpPath=./java_pid<pid>.hprof
  • 了解
    • -XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
    • -XX:+UseGCOverheadLimit

垃圾回收器相关的

  • 埋个坑

GC 日志记录相关的

  • 埋个坑

意义,默认值,调优原则(重要, 待拆分)

  • 虚拟机栈
    • Xss1024k 等同于 -XX:ThreadStackSize=1024k

      • 意义:设置线程栈占用内存大小。

      注意:一般在相同物理内存下,如果减少-xss值会产生更大的线程数,但不同的操作系统对进程内线程数是有限制的,是不能无限生成。

  • 堆内存
    • -Xms2G -Xmx4G

      • 意义:设置堆内存的初始值和最大值。

      建议:通常这两个配置参数相等,可以使得堆相对稳定,避免不停震荡,动态扩容

  • 新生代
    • 方法一: Xmn256m

      • 为 新生代分配 256m 的内存(NewSize 与 MaxNewSize 设为一致)
    • 方法二:-XX:NewSize=256m -XX:MaxNewSize=1024m

      • 设置新生代的初始值和最大值。

      注意:不要将 -mn 和 -mx 设置相等,会导致 没有老年代,进而 oom。 -mn 过小会增加Minor GC频率,过大会减小老年代的大小。一般设为整个堆空间的1/4或1/3.

排查 OOM 流程 和 常见原因

  1. 对于线上环境,设置参数,拿到 oom 时堆内存快照
    1. 线上环境一般不能使用 jdk自带的故障分析工具,需要提前保存 堆内存快照
    2. -XX:+HeapDumpOnOutOfMemoryError
    3. -XX:HeapDumpPath=/app/logs/app.dump
  2. 使用快照分析工具分析 堆内存快照
    1. MAT(Memory Analyzer Tool)
    2. jvisualvm
  3. 常见的问题和原因
    1. java.lang.OutOfMemoryError: Java heap space
      • 首先肯定这是一个堆内存空间引起的问题,可能的原因有:
        1. 内存加载数据量过大
          • 例如不受行数限制的数据库查询语句,或者不限制字节数的文件读取等,事故系统显然没有这些情况;
        2. 内存泄漏(资源未关闭/无法回收)
          • 当系统存在大量未关闭的 IO 资源,或者错误使用ThreadLocal等场景时也会发生OOM,经排查,也不存在这种情况;
        3. 系统内存不足
          • 系统内存不足以支撑当前业务场景所需要的内存,过小的机器内存或者不合理的JVM内存参数。

参考文章

相关推荐
野犬寒鸦36 分钟前
从零起步学习并发编程 || 第四章:synchronized底层源码级讲解及项目实战应用案例
java·服务器·开发语言·jvm·后端·学习·面试
2301_8223663511 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
阿猿收手吧!12 小时前
【C++】C++原子操作:compare_exchange_weak详解
java·jvm·c++
tb_first13 小时前
万字超详细苍穹外卖学习笔记2
java·jvm·数据库·spring·tomcat·maven
2301_8223636014 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
tb_first16 小时前
万字超详细苍穹外卖学习笔记1
java·jvm·spring boot·笔记·学习·tomcat·mybatis
闻哥17 小时前
深入理解 Spring @Conditional 注解:原理与实战
java·jvm·后端·python·spring
zhihuaba19 小时前
构建一个基于命令行的待办事项应用
jvm·数据库·python
马猴烧酒.21 小时前
【DDD重构|第十三天】DDD 领域驱动设计详解+实战
java·jvm·ide·重构·tomcat·maven·团队开发
筷乐老六喝旺仔21 小时前
使用Python进行PDF文件的处理与操作
jvm·数据库·python