JVM的命令行与运行时参数

 目录

1、GC日志相关参数

2、JVM监控及诊断工具

3、JVM监控及诊断工具-命令行篇

 4、JVM运行时参数


1、GC日志相关参数

  • -XX:+PrintGC 或 -verbose:gc 输出简单GC日志信息

  • -XX:+PrintGCDeatils 输出详细GC日志信息 常用

  • -XX:+PrintGCTimeStamps 需要搭配输出GC信息使用,输出程序运行时间 常用

  • -XX:+PrintGCDateStamps 需要搭配输出GC信息使用,输出时间戳

  • -Xloggc:d:\gc.log 将GC信息输出到d:\gc.log文件中 常用

  • -XX:PrintHeapAtGC 每次GC前后打印堆信息

可以采用GCeasy在线分析GC日志

2、JVM监控及诊断工具

  • Jconsole  JDK自带

  • Visual VM JDK自带

  • JProfile 

  • Arthas

Arthas基本命令

  • help——查看命令帮助信息
  • cat——打印文件内容,和linux里的cat命令类似
  • echo–打印参数,和linux里的echo命令类似
  • grep——匹配查找,和linux里的grep命令类似
  • base64——base64编码转换,和linux里的base64命令类似
  • tee——复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
  • pwd——返回当前的工作目录,和linux命令类似
  • cls——清空当前屏幕区域
  • session——查看当前会话的信息
  • reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
  • version——输出当前目标 Java 进程所加载的 Arthas 版本号
  • history——打印命令历史
  • quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
  • stop——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
  • keymap——Arthas快捷键列表及自定义快捷键

jvm相关

  • dashboard——当前系统的实时数据面板
  • thread——查看当前 JVM 的线程堆栈信息
  • jvm——查看当前 JVM 的信息
  • sysprop——查看和修改JVM的系统属性
  • sysenv——查看JVM的环境变量
  • vmoption——查看和修改JVM里诊断相关的option
  • perfcounter——查看当前 JVM 的Perf Counter信息
  • logger——查看和修改logger
  • getstatic——查看类的静态属性
  • ognl——执行ognl表达式
  • mbean——查看 Mbean 的信息
  • heapdump——dump java heap, 类似jmap命令的heap dump功能
  • vmtool——从jvm里查询对象,执行forceGc

class/classloader相关

  • sc——查看JVM已加载的类信息
  • sm——查看已加载类的方法信息
  • jad——反编译指定已加载类的源码
  • mc——内存编译器,内存编译.java文件为.class文件
  • retransform——加载外部的.class文件,retransform到JVM里
  • redefine——加载外部的.class文件,redefine到JVM里
  • dump——dump 已加载类的 byte code 到特定目录
  • classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor/watch/trace相关

请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。

  • monitor——方法执行监控
  • watch——方法执行数据观测
  • trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
  • stack——输出当前方法被调用的调用路径
  • tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

3、JVM监控及诊断工具-命令行篇

  • jps 查看Java进程
    • jps: 显示Java进程号和主类名称

    • jps -q:只显示Java进程号

    • jps -l:显示主类全类名

    • jps -m:显示主类main()的参数

    • jps -v:显示进程启动的JVM参数

  • jstat查看JVM统计信息

    • 格式: jstat -<option> [-t] [-h] <vmid> [interval] [count]

    • option: 要查看什么统计信息

    • -t : 程序运行到现在耗时
    • -h : 输出多少行后输出一次表头信息
    • vmid: 要查看的进程号
    • interval: 间隔多少毫秒输出一次统计信息
    • count: 输出多少次终止

image-20210517222044663

 当GC时间占总时间比率很大时,说明频繁GC,越大越可能OOM

当老年代占用内存不断上涨,可能出现内存泄漏

  • jinfo实时查看,修改JVM参数

    • jinfo -sysprops pid: 查看System.getProperties()取得的参数 (很多信息)

    • jinfo -flags pid: 查看曾经赋值的参数

    • jinfo -flag JVM参数名 pid: 查看某个Java进程的具体某个参数信息

    • jinfo -flag [+/-]JVM参数名 pid修改布尔类型

    • jinfo -flag JVM参数名=参数值 pid修改非布尔类型

  • 扩展

    • java -XX:+PrintFlagsInitial: 查看所有JVM参数启动初始值
    • java -XX:+PrintFlagFinal: 查看所有JVM参数最终值
    • java -参数名:+PrintCommandLineFlags 查看被修改过的某参数值
  • jmap导出内存映像文件和内存使用情况

    • jmap [option] pid   option有以下选项

image-20210518090954961

  • 手动导出 : 手动直接立即导出
    • jmap -dump:format=b,file=导出目录\文件名.hprof pid

    • jmap -dump:live,format=b,file=导出目录\文件名.hprof pid

  • 自动导出: 启动程序时需要带参数,发生OOM时自动导出

    • -XX:+HeapDumpOnOutOfMemoryError
    • -XX:HeapDumpPath=导出目录\文件名.hprof

         jmap会访问所有对象,为了不被用户线程干扰,jmap会借助安全点,在安全点中所有线程不会改变堆中对象状态,也就是说: jmap导出的内存快照文件都是在安全点位置的。结果可能出现偏差(比如某对象声明周期在两个安全点,使用live时就无法探知到这些对象)

  • jstack打印JVM线程快照

    • jstack option pid 

image-20210518224426354

  •  jcmd多功能命令行
    • jcmd可以实现除了jstat外所有指令的功能

image-20210518225518037

 4、JVM运行时参数

  • 打印设置的-XX选项
    • -XX:+PrintCommandLineFlags 打印命令行启动时添加的-XX选项或JVM自动设置的-XX选项
    • -XX:+PrintFlagsInitinal 打印出所有-XX选项默认值
    • -XX:+PrintFlagsFinal 打印出-XX选项最终在程序运行时的值(使用 jinfo -flag 修改参数 pid 进行修改)
    • -XX:+PrintVMOption 打印JVM参数
  • 运行时内存区的-XX选项

    • -Xss100k 设置栈内存为100k,等同于-XX:ThreadStackSize

    • Xms100m 设置堆内存初始化为100m,等同于-XX:InitalHeapSize=100m

    • Xmx100m 设置最大堆内存为100m,等同于-XX:MaxHeapSize=100m

    • Xmn2g 设置年轻代最大内存为2g,等同于-XX:NewSize=2g+-XX:MaxNewSize=2g

    • -XX:+UseAdaptiveSizePolicy 自动选择各区比例大小(默认开启)

    • -XX:SurvivorRatio=8 设置survivor:Eden占比为 1:1:8

      • 这个值默认为8,如果-XX:+UseAdaptiveSizePolicy是开启的,survivor:eden比例会被自动调成为1:1:6
    • -XX:NewRatio=2 设置年轻代:老年代占比为 1:2

    • -XX:PretenureSizeThreadshold=2014 设置内存大于此值(byte)的对象作为大对象直接分配到老年代

    • -XX:MaxTenuringThreshold=15 对象年龄超过15进入老年代

    • -XX:+PrintTenuringDistribution JVM每次MinorGC后打印出当前使用的Survivor中对象的年龄分布

    • -XX:TargetSurvivorRatio MinorGC结束后Survivor区域中占用空间的期望比例

  • 方法区的-XX选项

    • -XX:MetaspaceSize 元空间初始大小

    • -XX:MaxMetaspaceSize 元空间最大大小
    • -XX:+UseCompressedOops 使用压缩对象指针
    • -XX:+UseCompressedClassPointers 使用压缩类执行
    • -XX:ComporessedClassSpaceSize 设置ClassMetaspace大小,默认1g
  • 直接内存的-XX选项

    • -XX:MaxDiectMemorySize 设置直接内存大小,未指定则和最大堆内存一致

  • OOM相关的-XX选项

    • -XX:+HeapDumpOutOfMemoryError 发生OOM时生成堆dump文件

    • -XX:+HeapDumpBeforeFullGC 发生FullGC时生成堆dump文件

    • -XX:HeapDumpPath=d:\指定生成堆dump文件路径为d:\ (默认生成的dump文件在项目当前目录下)

    • -XX:OnOutOfMemoryError=/opt/restart.sh 发生OOM时去执行/opt/restart.sh文件

  • 垃圾收集器相关的-XX选项

    • Serial 串行收集器
      • -XX:+UseSerialGC 年轻代,老年代都使用串行收集器
    • ParNew 并行收集器

      • -XX:+UseParNewGC 年轻代使用ParNew收集器
      • JDK14 CMS被移除 没有老年代收集器配合 , 被废弃
    • Parallel 吞吐量优先并行收集器

      • -XX:+UseParallelGC -XX:+UseParallelOldGC 使用任意一个参数,新生代,老年代就会使用Parallel收集器
      • -XX:ParallelGCThreads 设置年轻代并行收集线程个数,逻辑处理器(CPU)个数 < 8 : 设置与核心数相同,CPU个数 > 8 : 设置线程数 = 3 + (5 * 核心数) / 8
      • -XX:+UseAdaptiveSizePolicy 自适应调节策略
      • -XX:MaxGCPauseMillis 设置最大STW时间,单位ms.Parallel 主打高吞吐量优先,该参数具体值最好由-XX:+UseAdaptiveSizePolicy来分配
      • -XX:GCTimeRatio=N 垃圾收集时间占比(1/N+1)。用于衡量吞吐量,该值设置越大就与设置最大STW时间-XX:MaxGCPauseMillis 矛盾,不能同时使用
    • CMS 并发收集器

      • ​​​-XX:+UseConcMarkSweepGC老年代使用CMS垃圾收集器,新生代使用ParNew收集器

      • -XX:CMSInitiatingOccupancyFraction设置老年代使用多少空间时开始垃圾回收。如果设置的太高,不够内存分配,不能满足并发执行,就会冻结用户线程启动Serial Old收集器,停顿时间就会变长。如果内存增长缓慢可以设置高一些,如果内存增长很快就要设置低一些 默认92%

      • -XX:+UseCMSCompactAtFullCollection指定在FULL GC后是否对内存进行压缩整理。开启后,通过-XX:CMSFullGCsBeforeCompaction设置执行多少次FULL GC后进行内存压缩整理

      • -XX:ParallelCMSThreads 设置CMS线程数量
  • G1 低延迟分代收集器

    • -XX:+UseG1GC 使用G1收集器

    • -XX:G1HeapRegionSize设置每个region大小

    • -XX:MaxGCPauseMillis设置预期停顿时间 (默认200ms,最好不要太小)

    • -XX:ParallelGCThread设置STW时GC线程数

    • -XX:ConcGCThreads设置并发标记线程数

    • -XX:InitiatingHeapOccupancyPercent设置触发老年代GC的堆占用率阈值

    • 使用分代收集器最好不要使用-XX:NewRatio , -Xmn这种参数,会影响G1自动调节

  • GC日志相关的-XX选项

    • -XX:+PrintGC 或 -verbose:gc 输出简单GC日志信息

    • -XX:+PrintGCDeatils 输出详细GC日志信息 常用

    • -XX:+PrintGCTimeStamps 需要搭配输出GC信息使用,输出程序运行时间 常用

    • -XX:+PrintGCDateStamps 需要搭配输出GC信息使用,输出时间戳

    • -Xloggc:d:\gc.log 将GC信息输出到d:\gc.log文件中 常用

    • -XX:PrintHeapAtGC 每次GC前后打印堆信息

  • 其他JVM参数

image-20210522162803044

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值