JVM(三):JVM命令与参数

JVM命令与参数


经过前面的各种分析学习,我们知道了关于JVM很多的知识,包括版本信息,类加载,堆,方法区,垃圾回收等,这一章我们来好好聊一聊关于怎么将这些内容进行直观地展示在我们面前,包括怎么进行相应地一些设置。

JVM参数

标准参数

  • -version
  • -help
  • -cp

image-20221006150329154

-X 参数

非标准参数,也就是在JDK各个版本中可能会变动

  • -Xint 使用解释模式,启动很快,执行稍慢
  • -Xcomp 使用纯编译模式,执行很快,启动很慢
  • -Xmixed 默认为混合模式,开始解释执行,启动速度较快,对热点代码实行检测和编译

image-20221006151127165

-XX参数

使用得最多地参数类型,非标准化参数,相对不稳定,主要用于JVM调优和Debug

  1. Boolean类型

    格式:-XX[±] <name> +或- 表示启用或者禁用name属性

    比如:-XX:+UseConcMarkSweepGC 表示启用CMS类型的垃圾回收器

    ​ -XX:+UseG1GC 表示启用G1类型的垃圾回收器

  2. 非Boolean类型

    格式:-XX:<name>=<value>表示name属性的值是value

    比如:-XX:MaxGCPauseMillis=500 表示GC最大停顿时间为500毫秒

想要设置的话,得先知道默认JVM中参数相关的信息

下面这个针对的是Java这个进程

java -XX:+PrintFlagsFinal -version > flags.txt

如果要查看一个运行中的JVN相关参数的信息,可以使用jinfo,不过要先知道Java进程的ID。比如启动一个tomcat,它的PID为200,如下图所示

image-20221006153156718

通过 jinfo -flags PID 查看更多

image-20221006153752210

设备参数的常见方式

  • 开发工具中设置比如IDEA,Eclipse
  • 运行jar包的时候设置,例如 java -XX:+UseG1GC xxx.jar
  • web容器比如tomcat,可以在脚本中进行设置
  • 通过jinfo实时调整某个java进程的参数(参数只有被标记为manageable的flags可以被实时修改)

其他参数

  • Xms1000等价于 -XX:InitialHeapSize=1000
  • Xmx1000等价于 -XX:MaxHeapSize=1000
  • Xss1000等价于 -XX:ThreadStackSize=100

其实这块也相当于是-XX类型的参数

说明

一般要设置参数,可以先查看一下当前参数是什么,值得注意的是“=”表示默认值,“:=表示被用户或JVM修改后的值”。

常用参数的意义

参数 含义 说明
-XX:CICompilerCount=3 最大并行编译数 如果设置大于1,虽然编译速度会提高,但是同样影响系统稳定性,
会增加JVM崩溃的可能
-XX:InitialHeapSize=100M 初始化堆大小 简写为-Xms100M
-XX:MaxHeapSize=100M 最大堆大小 简写为-Xmx100M
-XX:NewSize=20M 新生代大小
-XX:MaxNewSize=50M 最带新生代大小
-XX:OldSize=50M 老年代大小
-XX:MetaspaceSize=50M 方法区大小
-XX:MaxMetaspaceSize=50M 最大方法区大小
-XX:+UseParalleGC 使用ParalleGC 新生代,吞吐量优先
-XX:+UseParalleOldGC 使用ParalleOldGC 老年代,吞吐量邮箱
-XX:+UseConcMarkSweepGC 使用CMS 老年代,停顿时间优先
-XX:-UseG1GC 使用G1GC 新生代,老年代,停顿时间优先
-XX:NewRatio 新老生代的比值 比如-XX:Ratio=4,则表示新生代:老年代=1:4,也就是新生代占整个堆内存的1/5
-XX::SurvivorRatio 两个S区和Eden区的比值 比如-XX:SurvivorRatio=8,也就是(S0+S1): Eden=2:8,也就是一个S占整个新生代的 1/10
-XX:+HeapDumpOnOutOnMemeryError 启动堆内存溢出打印 当JVM堆内存发生溢出时,也就是OOM,自动生成dump文件
-XX:HeapDumpPath=heap.hprof 制定堆内存溢出打印目录 表示在当前目录生成一个heap。hprof文件
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps Xloggc:$CATALINA_HOME/logs/gc.log
打印出GC日志 可以使用不同的垃圾收集器,对比查看GC情况
-Xss128k 设置每个线程的栈堆大小 经验值是3000-5000最佳
-XX::MaxTenuringThreshold=6 老年代的最大临界值 默认值为15
-XX:InitiatingHeapOccupancyPercent 启动并发GC周期时堆内存使用占比 G1之内的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比,值为0则表示“一直执行GC循环”,默认值为45
-XX:G1HeapWastePercent 允许浪费堆空间的占比 默认是10%,如果并发标记可回收的空间小于10%,则不会触发MixedGC。
-XX:MaxGCPauseMillis=200ms G1最大停顿时间 暂停时间不能太小,太小的话就会导致出现G1跟不上垃圾产生的速度。最终退化为Full GC。所以对这个参数的调优是一个持续的过程,逐步调整到最佳状态。
-XX:ConcGCThreads=n 并发垃圾收集器使用的线程数量 默认值随JVM运行平台的不同而不同
-XX:G1MixedGCLiveThresholdPercent 混合垃圾回收周期中要包括的旧区域设置占用率阈值 默认占用率为65%
-XX:G1MixedGCCountTarget 设置标记周期完成后,对存活数据上限为G1MixedGCLiveThresholdPercent的旧区域执行混合垃圾回收的目标次数 默认8次混合垃圾回收,混合回收的目标是要控制在此目标次数以内
-XX:G1OldCSetRegionThresholdPercent 指定每轮Mixed GC回收的Region最大比例 默认情况下,G1只把10%的Old Region加入到CSet中

常用命令

命令详细介绍可在官网中查询 search

jps

查看java进程

image-20221009233946661

image-20221009233352492

jinfo

实时查看和调整JVM配置参数

image-20221009234057994

查看用法

jinfo -flag name PID 查看某个java进程的name属性值

比如:

jinfo -flag MaxHeapSize PID 查看最大堆内存大小

jinfo -flag Use G1GC PID 查看是否使用G1GC

image-20221009234452943

调整用法

参数只有被标记为Manageable的flags可以被实时修改

jinfo -flag [+|-] PID

jinfo -flag <name>=<value> PID

查看曾经赋过值的一些参数

jinfo -flags PID

image-20221009234944520

jstat

查看虚拟机性能统计信息

image-20221009235129000

查看类装载信息

jstat -class PID 1000 10 查看某个Java进程的类装载信息,每1000毫秒输出一次,供输出10次

image-20221010002021364

查看垃圾收集信息

jstat -gc PID 1000 10 查看某个Java进程的垃圾收集信息,每1000毫秒输出一次,供输出10次

image-20221010002031832

jstack

查看线程堆栈信息

image-20221013001237565

用法

jstack PID

image-20221013002047742

jmap

生成堆转储快照

image-20221013002135724

打印出堆内存相关信息

jmap -heap PID

image-20221013002528993

dump出堆内存相关信息

jmap -dump:format=b,file=xxx.hprof PID

image-20221013002849039

dump下来的文件直接看有些费力,可以结合MAT工具分析。一般在开发中,JVM参数可以通过添加参数,这样内存溢出时,会自动dump该文件

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof

常用工具

jconsole

JConsole工具是JDK自带的可视化监控工具,查看Java应用程序的运行情况,监控堆信息,永久区使用情况,类加载情况等

jvisualvm

  1. 可以监控本地的java进程的cpu,类,线程等

  2. 也可以监控远端java进程,比如监控远端tomcat

    如果是连接远端tomcat[也可以是任意Java进程],比如部署在阿里云服务器上的tomcat,可以按照以下步骤
    (1)在visualvm中选中“远程”,右击“添加”
    (2)主机名上写服务器的ip地址,比如39.100.39.63
    (3)右击该主机,添加“JMX”,也就是通过JMX技术具体监控远端服务器哪个Java进程
    (4)要想让服务器上的tomcat被连接,需要改一下Catalina.sh这个文件

    注意端口不要和服务器上的有冲突

    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -
    Djava.rmi.server.hostname=39.100.39.63 -Dcom.sun.management.jmxremote.port=8998 -
    Dcom.sun.management.jmxremote.ssl=false -
    Dcom.sun.management.jmxremote.authenticate=true -
    Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access -
    Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password"
    

    (5)在…/conf文件中添加两个文件jmxremote.access和jmxremote.password

    jmxremote.access

    guest readonly
    manager readwrite
    

    jmxremote.password

    guest guest
    manager manager
    

    授予权限 :chomd 600 *jmxremot*

    (6)将连接服务器地址改为公网ip地址

    (7)查看端口监听情况

    lsof -i:port #得到PID
    netstat -antup | grep PID
    

    (8)设置上述端口的防火墙策略和安全组策略

    (9)启动远端java进程,

    (10)在jmx 中输入端口,输入用户名和密码即可登录成功

内存分析工具 MAT

GC日志分析工具

要想分析日志的信息,首先得拿到GC日志文件,可以通过配置启动参数获取GC日志文件

XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log

  1. 在线查看工具 http://gceasy.io
  2. GCViewer

(9)启动远端java进程,

(10)在jmx 中输入端口,输入用户名和密码即可登录成功

内存分析工具 MAT

GC日志分析工具

要想分析日志的信息,首先得拿到GC日志文件,可以通过配置启动参数获取GC日志文件

XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log

  1. 在线查看工具 http://gceasy.io
  2. GCViewer

猜你喜欢

转载自blog.csdn.net/Hong_pro/article/details/130550113