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 都是缩写
- Boolean类型
常用参数
-
查看JVM默认值
- -XX:+PrintFlagsInitial
- 打印初始化JVM各个参数的值
- -XX:+PrintFlagsFinal
- 打印最终(目前)JVM各个参数的值
- -XX:+PrintCommandLineFlags
- 打印运行时命令行设置的JVM参数
- -XX:+PrintFlagsInitial
-
设置各个空间大小
- -Xms
- 堆初始化值
- -Xmx
- 堆最大值(默认四分之一内存)
- -Xss
- 虚拟栈内存(默认1024k)
- -XX:MetaspaceSize
- 元空间初始化大小(默认20m)
- -XX:MaxMetaSpaceSize
- 元空间最大值(默认没有限制)
- -XX:MaxDirectMemorySize
- 直接操作内存的大小 即不操作虚拟机的内存(默认四分之一内存)
- -Xms
-
垃圾回收相关
- 查看回收信息
- -XX:+PrintGCDetails
- 开启GC日志
- +XX:+PrintGCTimeStamps
- 打印每次GC的时间戳
- -XX:+PrintGCDetails
- 选择回收器
- +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:UseSerialGC
- 垃圾回收相关参数
- -XX:MaxTenuringThreadhold
- 进入老年代所需次数,默认15
- -XX:MaxTenuringThreadhold
- 垃圾回收相关参数(非G1)
- -XX:MaxNewSize
- 新生代最大内存 默认16M
- -XX:NewRatio
- 年轻代和老年代大小比值,取值为整数,默认为2
- -XX:SurvivorRatio
- Eden区与Survivor区大小的比值,取值为整数,默认为8
- -XX:MaxNewSize
- 垃圾回收相关参数(G1)
- -XX:G1HeapRegionSize
- 设置的G1区域的大小。值是2的幂,范围是1MB到32MB。目标是根据最小的Java堆大小划分出约2048个区域。
- -XX:MaxGCPauseMillis
- 最大GC停顿时间,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间。
- -XX:InitiatingHeapOccupancyPercent
- 堆占用了多少的时候就触发GC,默认为45
- -XX:ConcGCThreads
- 并发GC使用的线程数。
- -XX:G1ReservePercent
- 设置作为空闲的预留内存百分比,以降低目标空间溢出的风险,默认值是10%
- -XX:G1HeapRegionSize
- 查看回收信息
问题定位
查看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命令
- 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)
-