JVM常用参数及使用JDK监控工具定位问题

JVM参数

JVM的参数类型

  • 标配参数
  • X参数
  • XX参数
    • Boolean类型
      • 公式:-XX:+或者-某个属性值(+表示开启 -表示关闭)
      • 例如:-XX:+PrintGCDetails(开启GC日志)、-XX:-PrintGCDetails(关闭GC日志)
    • KV设值类型
      • 公式:-XX:属性key=属性值value
      • 例如:-XX:MetaspaceSize=128m(设置元空间)、-XX:MaxTenuringThreadhold=15(设置分代次数)
    • 说明:-Xms、-Xmx、-Xss 都是缩写

常用参数

  • 查看JVM默认值

    • -XX:+PrintFlagsInitial
      • 打印初始化JVM各个参数的值
    • -XX:+PrintFlagsFinal
      • 打印最终(目前)JVM各个参数的值
    • -XX:+PrintCommandLineFlags
      • 打印运行时命令行设置的JVM参数
  • 设置各个空间大小

    • -Xms
      • 堆初始化值
    • -Xmx
      • 堆最大值(默认四分之一内存)
    • -Xss
      • 虚拟栈内存(默认1024k)
    • -XX:MetaspaceSize
      • 元空间初始化大小(默认20m)
    • -XX:MaxMetaSpaceSize
      • 元空间最大值(默认没有限制)
    • -XX:MaxDirectMemorySize
      • 直接操作内存的大小 即不操作虚拟机的内存(默认四分之一内存)
  • 垃圾回收相关

    • 查看回收信息
      • -XX:+PrintGCDetails
        • 开启GC日志
      • +XX:+PrintGCTimeStamps
        • 打印每次GC的时间戳
    • 选择回收器
      • +XX:UseSerialGC
        • Serial(新生代)+SerialOld(老年代)
      • +XX:UseParNewGC
        • ParNew(新生代)+SerialOld(老年代)
      • +XX:UseParallalGC
        • Parallal(新生代)+ParallalOld(老年代)
      • +XX:UseParallalOldGC
        • Parallal(新生代)+ParallalOld(老年代)
      • +XX:UseConcMarkSweepGC
        • Parallal(新生代)+ CMS(老年代)+SerialOld(逃生门)
      • +XX:UseG1GC
        • G1(新、老)
    • 垃圾回收相关参数
      • -XX:MaxTenuringThreadhold
        • 进入老年代所需次数,默认15
    • 垃圾回收相关参数(非G1)
      • -XX:MaxNewSize
        • 新生代最大内存 默认16M
      • -XX:NewRatio
        • 年轻代和老年代大小比值,取值为整数,默认为2
      • -XX:SurvivorRatio
        • Eden区与Survivor区大小的比值,取值为整数,默认为8
    • 垃圾回收相关参数(G1)
      • -XX:G1HeapRegionSize
        • 设置的G1区域的大小。值是2的幂,范围是1MB到32MB。目标是根据最小的Java堆大小划分出约2048个区域。
      • -XX:MaxGCPauseMillis
        • 最大GC停顿时间,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间。
      • -XX:InitiatingHeapOccupancyPercent
        • 堆占用了多少的时候就触发GC,默认为45
      • -XX:ConcGCThreads
        • 并发GC使用的线程数。
      • -XX:G1ReservePercent
        • 设置作为空闲的预留内存百分比,以降低目标空间溢出的风险,默认值是10%

问题定位

查看Linux性能

  • 整机:top
    • uptime,系统性能命令的精简版
  • CPU:vmstat
    • 查看CPU(包含不限于)
    • 查看额外
      • 查看所有cpu核信息 mpstat -P ALL 2
      • 每个进程使用cpu的用量分解信息 pidstat -p进程编号 -u 采样间隔秒数
  • 内存:free
    • 应用程序可用内存数 free 、free -g、free -m
    • 一般情况
      • 应用程序可用内存/系统物理内存>70%内存充足。
      • 应用程序可用内存/系统物理内存<20%内存不足,需要增加内存。
      • 20%<应用程序可用内存/系统物理内存<70%内训基本够用
    • 查看额外
      • pidstat -p 进程号 -r 采样间隔秒数
  • 硬盘:df
    • 查看磁盘剩余空间数 df -h
  • 磁盘IO:iostat
    • 磁盘I/O性能评估 iostat -xdk 2 3
    • 查看额外
      • pidstat -p 进程号 -d 采样间隔秒数
  • 网络IO:ifstat
    • 默认本地没有,下载ifstat

定位步骤
结合Linux和JDK命令一块分析

  • 先用top命令找出CPU占比最高的

  • ps -ef或者jps进一步定位,得知是一个是哪一个后台程序

  • 定位到具体线程或者代码

    • ps -mp 进程id -o THREAD,tid,time
    • 参数解释
      • -m显示所有的线程
      • -p pid进程使用cpu的时间
      • -o该参数后是用户自定义格式
  • 将需要的线程ID转换为16进制格式(英文小写格式)

  • jstack 进程ID | grep(16进制线程ID小写英文) -A60
    在这里插入图片描述

  • JDK自带的JVM监控和性能分析工具

    • jps

      • JVM 进程状态工具,主要用来输出JVM中运行的进程状态信息
      • jps [options] [hostid]
        • -q:不输出类名、Jar名 和传入main方法的参数
        • -m:输出传入main方法的参数
        • -l:输出main类或Jar的全限名
        • -v:输出传入JVM的参数
        • 如果不指定hostid就默认为当前主机或服务器。
    • jhsdb

      • jdk11里建议:jstack、jmap(必须)、jinfo、jsnap命令前,都使用jhsdb命令
        在这里插入图片描述
    • jinfo

      • jinfo命令可以查看java进程的运行时jvm参数详细信息,例如最大堆内存、使用的什么垃圾收集器等
      • jinfo -flags pid查看指定java进程的所有jvm运行参数
        在这里插入图片描述
      • jinfo -flag param pid查看某个参数
        在这里插入图片描述
    • jstack

      • 用来查看某个Java进程内的线程堆栈信息,实时监测系统运行时线程栈信息,而不用暂停程序排查,常用于线上系统的问题排查,一般都是间隔一段时间使用jstack命令打印出当前系统实时快照,然后比对线程在在锁上的执行状态来判断系统是否存在死锁、过度竞争等问题。
      • jstack [option] pid
        jstack [option] executable core
        jstack [option] [server- id@ ]remote hos tname-or- ip
        • -l:long listings, 会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
        • -m mixed mode, 不仅会输出Java堆栈信息,还会输出C/C++ 堆栈信息(比如Native方法)
      • jstack -l pid查看某一JVM进程的所有线程的信息
        在这里插入图片描述
      • jstack -l pid | grep tid查看某一JVM进程的指定线程的信息
        在这里插入图片描述
    • jhsdb jmap

      • jmap用来查看堆内存(JVM中各个代的内存情况,对象占用情况)使用状况,还可以导出整个JVM的内存信息,一般结合jhat使用。如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候自动生成dump文件。

      • jmap在jdk11已经过时 必须使用jsdb jmap

      • jmap -heap [pid]查看整个JVM中内存使用情况(还含有JDK版本,GC策略相关等)。
        在这里插入图片描述

      • jmap -finalizerinfo pid打印等待回收的对象信息
        在这里插入图片描述

      • jmap -histo [pid]查看JVM堆中存活对象的详细使用情况,常用于分析OutOfMemory
        在这里插入图片描述

      • jmap -dump pid堆到文件

        在这里插入图片描述
        使用VisualVM分析.hprof文件
        在这里插入图片描述

    • jstat

      • JVM统计监测工具, 常用来实时监测系统堆的使用情况,以及GC信息、编译信息、类加载信息,常用来判断系统JVM参数是否设置合理,作为系统参数调优的信息统计工具。
      • jstat [ general0ption| outputOptions vmid [ interval[s |ms] [ count]] ]
        • general0ption 根据jstat统计的维度不同,可以使用如下表中的选项进行不同维度的统计,不同的操作系统支持的选项可能会不一样,可以通过-options选项,查看不同操作系统所支持选项。

          -Class	    		用于查看类加载情况的统计
          -compiler			用于查看HotSpot中即时编译器编译情况的统计
          -gc					用于查看JVM中堆的垃圾收集情况的统计
          -gccapacity			用于查看新生代、老生代及持久代的存储容量情况
          -gccause			用于查看垃圾收集的统计情况(这个和- gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因。
          -gcnew 				用于查看新生代垃圾收集的情况
          -gcnewcapacity		用于查看新生代的存储容量情况
          -gcold 				用于查看老生代及持久代发生GC的情况
          -gcoldcapacity		用于查看老生代的容量
          -gcpermcapacity		用于查看持久代的容量
          -gcutil				用于查看新生代、老生代及持代垃圾收集的情况
          -printcompilation	HotSpot编译方法的统计
          
        • outputOptions

          • -h:用于指定每隔几行就输出列头,如果不指定,默认是只在第行出现列头。
          • -J:用于将给定的javaOption传给java应用程序加载器,例如,“-J-Xms48m"将把启动内存设置为48M。
          • -t:用于在输出内容的第列显示时间戳,这个时间戳代表的时JVM开始启动到现在的时间
        • vmid 是虚拟机ID,在LinuxUnix系统 上一般就是进程ID。

        • interval 是采样时间间隔毫秒ms

        • count 是采样数目。

      • 例子
        在这里插入图片描述
        在这里插入图片描述
    • 参数说明(来自:https://blog.csdn.net/fenglibing/article/details/6411951)
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

发布了109 篇原创文章 · 获赞 47 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43934607/article/details/104393563