Java教程

JVM常用参数及命令

本文主要是介绍JVM常用参数及命令,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1 JVM运行参数

在jvm中有很多的参数可以进行设置,这样可以让jvm在各种环境中都能够高效的运行。绝大部分的参数保持默认即可。

jvm的参数类型分为三类,分别是:
标准参数
-help
-version
-X参数 (非标准参数)
-Xint
-Xcomp
-XX参数(使用率较高)
-XX:newSize
-XX:+UseSerialGC

1.1 标准参数

jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help检索出所有的标准参数。
例如:通过-D设置系统属性参数

public class ParamJVM {
    public static void main(String[] args) {
        String name = System.getProperty("name");
        String param = name == null ? "Hello JVM" : name;
        System.out.println(param);
    }
}

测试

$ ll
total 16
-rwxr-xr-x  1 qin  staff   574B Mar 25 21:44 ParamJVM.class
-rwxr-xr-x@ 1 qin  staff   219B Mar 25 21:43 ParamJVM.java

# qin @ QinMac in /Users/Workspace/test [21:46:35]
$ java ParamJVM
Hello JVM

# qin @ QinMac in /Users/Workspace/test [21:47:06]
$ java -Dname="hello" ParamJVM
hello

1.2 -X参数

jvm的-X参数是非标准参数,在不同版本的jvm中,参数可能会有所不同,可以通过java -X查看非标准参数。

$ java -X
    -Xmixed           混合模式执行 (默认)
    -Xint             仅解释模式执行
    -Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
                      设置搜索路径以引导类和资源
    -Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
                      附加在引导类路径末尾
    -Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
                      置于引导类路径之前
    -Xdiag            显示附加诊断消息
    -Xnoclassgc       禁用类垃圾收集
    -Xincgc           启用增量垃圾收集
    -Xloggc:<file>    将 GC 状态记录在文件中 (带时间戳)
    -Xbatch           禁用后台编译
    -Xms<size>        设置初始 Java 堆大小
    -Xmx<size>        设置最大 Java 堆大小
    -Xss<size>        设置 Java 线程堆栈大小
    -Xprof            输出 cpu 配置文件数据
    -Xfuture          启用最严格的检查, 预期将来的默认值
    -Xrs              减少 Java/VM 对操作系统信号的使用 (请参阅文档)
    -Xcheck:jni       对 JNI 函数执行其他检查
    -Xshare:off       不尝试使用共享类数据
    -Xshare:auto      在可能的情况下使用共享类数据 (默认)
    -Xshare:on        要求使用共享类数据, 否则将失败。
    -XshowSettings    显示所有设置并继续
    -XshowSettings:all
                      显示所有设置并继续
    -XshowSettings:vm 显示所有与 vm 相关的设置并继续
    -XshowSettings:properties
                      显示所有属性设置并继续
    -XshowSettings:locale
                      显示所有与区域设置相关的设置并继续

-X 选项是非标准选项, 如有更改, 恕不另行通知。


以下选项为 Mac OS X 特定的选项:
    -XstartOnFirstThread
                      在第一个 (AppKit) 线程上运行 main() 方法
    -Xdock:name=<应用程序名称>"
                      覆盖停靠栏中显示的默认应用程序名称
    -Xdock:icon=<图标文件的路径>
                      覆盖停靠栏中显示的默认图标

-Xint、-Xcomp、-Xmixed
解释模式(interpreted mode)下,-Xint标记会强制JVM执行所有的字节码,当然这会降低运行速度,通常低10倍或更多。
-Xcomp参数与它(-Xint)正好相反,JVM在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化。然而,很多应用在使用-Xcomp也会有一些性能损失,当然这比使用-Xint损失的少,原因是-xcomp没有让JVM启用JIT编译器的全部功能。JIT编译器可以对是否需要编译做判断,如果所有代码都进行编译的话,对于一些只执行一次的代码就没有意义了。
-Xmixed是混合模式,将解释模式与编译模式进行混合使用,由jvm自己决定,这是jvm默认的模式,也是推 荐使用的模式。
例如:强制设置运行模式

# 强制设置为解释模式
qin @ QinMac in /Users/Workspace/test [21:55:17]
$ java -showversion -Xint ParamJVM
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, interpreted mode)

Hello JVM
# 强制设置成编译模式
# qin @ QinMac in /Users/Workspace/test [21:55:18]
$ java -showversion -Xcomp ParamJVM
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, compiled mode)

Hello JVM

注意:编译模式下,第一次执行会比解释模式下执行慢一些,注意观察。
默认使用混合模式

# qin @ QinMac in /Users/Workspace/test [21:55:46]
$ java -showversion  ParamJVM
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

Hello JVM

1.3 -XX参数

-XX参数也是非标准参数,主要用于jvm的调优和debug操作。-XX参数的使用有2种方式,一种是boolean类型,一种是非boolean类型。

  • boolean类型
    格式:-XX:[+-]<name> 表示启用或禁用<name>属性
    如:-XX:+DisableExplicitGC 表示禁用手动调用gc操作,也就是说调用System.gc()无效
  • 非boolean类型
    格式:-XX:<name>=<value> 表示<name>属性的值为<value>
    如:-XX:NewRatio=4 表示新生代和老年代的比值为1:4
    举例
# qin @ QinMac in /Users/Workspace/test [21:55:57]
$ java -showversion -XX:+DisableExplicitGC ParamJVM
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

Hello JVM

1.4 -Xms与-Xmx参数

-Xms-Xmx分别是设置jvm的堆内存的初始大小和最大大小。
-Xmx2048m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为2048M。
-Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M。
适当的调整jvm的内存大小,可以充分利用服务器资源,让程序跑的更快。

$ java -Xms512m -Xmx2048m ParamJVM
Hello JVM

2 jinfo查看运行时参数

如果想要查看正在运行的JVM参数就需要借助于jinfo命令查看。
前提启动Java应用,这里我提前启动了普通SpringBoot应用“jvm-app-1.0.jar”。

$ ll
total 34376
-rwxr-xr-x  1 qin  staff   574B Mar 25 21:44 ParamJVM.class
-rwxr-xr-x@ 1 qin  staff   219B Mar 25 21:43 ParamJVM.java
-rw-r--r--  1 qin  staff    17M Jun 15  2020 jvm-app-1.0.jar

# 查看正在运行的Java应用
$ jps -l
9689 jvm-app-1.0.jar  # 进程号为:9689
476
8716 org.jetbrains.jps.cmdline.Launcher
9806 sun.tools.jps.Jps
687

# 查看运行时参数
$ jinfo -flags 9689
Attaching to process ID 9689, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.111-b14
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line:

# 查看某一参数的值,用法:jinfo -flag <参数名> <进程id>
$ jinfo -flag MaxHeapSize 9689
-XX:MaxHeapSize=4294967296

3 jstat查看堆内存使用量

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

3.1 查看class加载统计

$ jstat -class 9689
Loaded  Bytes  Unloaded  Bytes     Time
  5891 10710.6        1     0.9       1.81
返回值 说明
Loaded 加载class数量
Bytes 所占用空间大小
Unloaded 未加载数量
Bytes 未加载占用空间
Time 时间

3.2 查看编译统计

$ jstat -compiler 9689
Compiled Failed Invalid   Time   FailedType FailedMethod
    3029      0       0     4.47          0
返回值 说明
Compiled 编译数量
Failed 失败数量
Invalid 不可用数量
Time 时间
FailedType 失败类型
FailedMethod 失败方法

3.3 垃圾回收统计

$ jstat -gc 9689
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
5120.0 6656.0 4640.1  0.0   102912.0 45120.7   94208.0     5061.4   30128.0 28440.6 4016.0 3672.5      6    0.022   1      0.020    0.042

$ jstat -gc 9789 1000 3
9789 not found

# 也可以指定打印间隔和次数。每1秒打印一次,共3次
$ jstat -gc 9689 1000 3
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
5120.0 6656.0 4640.1  0.0   102912.0 45120.7   94208.0     5061.4   30128.0 28440.6 4016.0 3672.5      6    0.022   1      0.020    0.042
5120.0 6656.0 4640.1  0.0   102912.0 45120.7   94208.0     5061.4   30128.0 28440.6 4016.0 3672.5      6    0.022   1      0.020    0.042
5120.0 6656.0 4640.1  0.0   102912.0 45120.7   94208.0     5061.4   30128.0 28440.6 4016.0 3672.5      6    0.022   1      0.020    0.042
返回值 说明
S0C 第一个Survivor区的大小(KB)
S1C 第二个Survivor区的大小(KB)
S0U 第一个Survivor区的使用大小(KB)
S1U 第二个Survivor区的使用大小(KB)
EC Eden区的大小(KB)
EU Eden区的使用大小(KB)
OC Old区大小(KB)
OU Old使用大小(KB)
MC 方法区大小(KB)
MU 方法区使用大小(KB)
CCSC 压缩类空间大小(KB)
CCSU 压缩类空间使用大小(KB)
YGC 年轻代垃圾回收次数
YGCT 年轻代垃圾回收消耗时间
FGC 老年代垃圾回收次数
FGCT 老年代垃圾回收消耗时间
GCT 垃圾回收消耗总时间

4 jmap 生成堆转存快照

jmap(Memory Map for Java)命令用于生成堆转存快照。也可以通过运行时指定参数
-XX:+HeapDumpOnOutOfMemoryError让虚拟机在内存溢出异常出现之后自动生成堆Dump文件,可以指定存放路径,比如-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/jvm/dump.hprof。jmap命令格式:

jmap [option] vmid

jmap常用参数

  • -dump:生成Java堆转存快照
  • -heap:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。
  • -histo:显示Java堆详细信息,如使用哪种回收器、参数、分代状况
  • -permstat:以ClassLoader为统计口径显示永久代内存状态
  • -F:当虚拟机进程对-dump没有响应时,强制生成dump快照
这篇关于JVM常用参数及命令的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!