3、JVM性能调优


性能优化三部曲

  1. 性能监控:就是发现问题
  2. 性能分析:就是排查问题
  3. 性能调优:解决问题

监控诊断工具-命令行

jps

  • jps 查看正在运行的java进程id
    • -q 只显示进程id
    • -l 显示运行程序的全类名(如果是jar包,显示全路径)
    • -m 显示传递main方法的参数
    • -v 显示进程启动的参数,如:-Xms20m

jstat

  • jstat 查看JVM统计信息
    • - 有以下选项:

      • -class:显示类加载相关信息

      • -compiler: 显示JIT编译过的方法,耗时

      • -printcompilation:显示已经被JIT编译过的方法

      • -gc:显示和GC相关的堆信息

      • -gccapacity: 和-gc基本相同,主要关注堆的最大最小空间

      • -gcutil:和-gc基本相同,主要关注使用栈空间占总空间百分比

      • -gccause:和-gcutil功能一样,但会输出最后一次GC发生的原因

      • -gcnew:显示新生代GC

      • -gcnewcapacity:和-gcnew一样,但主要关注使用最大最小空间

      • -geold:显示老年代GC

      • -gcoldcapacity:和-gcold一样,但主要关注使用最大最小空间

      • -gcpermcapacity:显示永久代使用最大最小空间

    • [-t]

      输出信息前加上Timestamp列,显示程序运行实际,单位是秒

    • [-h]

      h就是表示表头的意思,每隔3条数据打印一个表头

    • [ []]

      如果只写1000,就是每一秒打印一次,一直打印
      如果带上10,就打印够10次,就不打印

jinfo

  • jinfo:可以查看和修改虚拟机配置信息
    • -sysprops 进程id:可以查看程序配置属性信息
    • -flags 进程id:查看曾经赋值过的参数
    • -flag 具体参数 进程id:查看某个java程序具体参数值,比如,是否使用GC
    • -flag 【+】或【-】具体参数 进程id:修改参数,比如:修改配置,打印GC信息
    • -flag 具体参数=具体参数配置值 进程id:修改配置参数的值,比如:修改堆大小100为90

jmap

  • jmap:可以获取堆的映射快照文件,也可以获取java进程的内存信息。
    • -dump:生成快照文件,如果是-dump:live 就会只保存存活对象
      • 手动方式:-dump:format-b,file=【输出路径】 进程id

        一般生成上使用-dump:live 只排查存活的对象就行了,不然这个hprof文件很大
      • 自动方式:-XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=【输出路径】.hprof
        这两个配置直接在家类的启动配置上就可以了,如果出现OOM,就会自动生成文件
    • -heap:输出整个堆的详细信息,包括GC和内存使用的信息
    • -histo:输出对象统计信息,如果是-histo:live 就只统计存活对象

jhat

  • jhat:
    因为使用jmap导出的dump文件是二进制的,正常时没法看的,所以需要jhat工具搭配使用。
    使用jhat命令,就启动了一个http服务,端口是7000,本地访问:https://arthas.aliyun.com/zh-cn/
    下载:https://arthas.gitee.io/arthas-boot.jar

    windows系统的话,直接下载本地就好了,linux系统服务器上面的话上传上去就好了

    启动方式1:

    直接java -jar arthas-boot.jar 就可以了,显示所有java进程

    先测试几个指令,比如先输入dashboard:

    显示进程的相关情况,还在实时监控,快捷键ctrl + c就停止了

    再输入thread,就会显示线程信息:

    如果要退出arthas 的话,输入exit 就好了

    启动方式2:

    java -jar arthas-boot.jar 进程id:监测指定java进程

    还可以通过浏览器访问,ip + 8563端口

    相关指令

    • 基础指令

      指令文档:https://arthas.aliyun.com/doc/advanced-use.html

    运行时参数

    参数选项类型

    标准参数选项

    以-开头,比较稳定,后期基本不会变化
    cmd 打开命令行端口,输入java -help 可以看到很多 - 开头的参数选项

    -X 参数选项

    以-X开头,功能比较稳定,但官方说后续版本可能会变更
    命令行输入java -X就可以看到所有-X的参数选项

    很多-X 选项的参数等价于-XX 选项的参数

    -XX 参数选项

    以-XX开头,属于实验性的,不太稳定,是使用最多的参数类型
    -XX:+【选项】:表示启用选项属性
    -XX:-【选项】:表示禁用选项属性

    属性值为数字,比如:
    -XX:InitalHeapSize=100m,设置堆初始化大小100m,当然也可以使用-Xms100m来代替,是等价关系的。

    属性值为字符串的,比如:
    -XX:HeapDumpPath=/usr/local/heapdump.hprof,来指定导出hprof文件的路径,配合下面的几个指令使用

    -XX:HeapDumpOnOutOfMemoryError,出现OOM异常时候,会自动产生.hprof文件
    -XX:HeapDumpBeforeFullGC,要执行FullGC之前,生成转储文件

    GC日志相关参数设置

    -XX:PrintGC:输出简化的GC日志
    -XX:printGCDetails: 输出GC进行垃圾回收时的详细日志,并在进程退出时输出内存各区域分配情况
    -XX:+PrintGCTimeStamps: 输出GC发生时的时间戳
    -XX:+PrintGCDateStamps: 输出GC发生时的时间戳,以日期格式显示
    -XX:+PrintHeapAtGC: 每一次GC前后,都打印堆信息
    -Xloggc:【路径】 把GC日志写入到一个文件中,不会打印在输出

JVM