JVM启动的常用命令以及参数
在上文 JVM 堆内存逻辑分区 中已经使用过一些 jvm 启动命令,本文着重讲述JVM启动命令用法以及一些常用的参数
一. 基本命令格式
java [options] classname [args...]
java [options] -jar filename.jar [args...]
① [options] - 命令行选项(可选)
比如标准参数 -version ,非标准参数 -Xms,非稳定参数 -XX:+PrintGCDetails,下面有详细说明
② classname - 要执行的类(必需)
指定包含 main 方法的类的全限定名:
java com.example.MyApp
③ [args…] - 传递给 main 方法的参数(可选)
这些参数会传递给应用程序的 main 方法的 String[] args 参数:
java MyApp arg1 arg2 arg3
④ 完整示例
# 复杂的实际应用示例
java \-Xms1g -Xmx4g \ # 堆内存设置-XX:+UseG1GC \ # 使用 G1 垃圾收集器-XX:MaxGCPauseMillis=200 \ # 最大 GC 暂停时间-Dspring.profiles.active=prod \ # Spring 环境配置-Dlog4j.configurationFile=conf/log4j2.xml \ # 日志配置-cp "lib/*:app.jar:config" \ # 类路径设置com.example.MainApplication \ # 主类--server.port=8080 \ # 应用参数--database.url=jdbc:mysql://localhost:3306/mydb
二. JVM 启动常用命令参数分类
JVM 常用命令参数主要分为三类:
- 标准参数
以 - 开头,是所有 JVM 实现必须支持的参数,例如:
-version:显示版本信息
-help:显示所有标准参数列表 - 非标准参数
以 -X 开头,默认支持但可能不保证所有 JVM 实现兼容,例如:
-Xms:设置初始堆内存(如 -Xms512m)
-Xmx:设置最大堆内存(如 -Xmx2g)
-Xmn:设置新生代大小(如 -Xmn2g) - 非稳定参数
以 -XX 开头,可能随版本变更而取消,需谨慎使用,例如:
-XX:MetaspaceSize:设置元空间初始大小
-XX:+PrintGCDetails:输出详细 GC 日志
三. 常用命令举例
非稳定参数举例
① java -XX:+PrintCommandLineFlags
主要作用是:在 JVM 启动时,打印出那些被显式设置或由 JVM 自动设置的关键 -XX 参数及其值。
java -XX:+PrintCommandLineFlags -version
C:\Users\Administrator>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=267006528 -XX:MaxHeapSize=4272104448 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
解读:
- -XX:InitialHeapSize=267006528 ,JVM 根据当前机器的内存,自动设置的初始堆大小约为 255 MB。
- -XX:MaxHeapSize=4272104448 ,JVM 自动设置的最大堆大小约为 4 GB。(大概是电脑内存的 1/4)
- -XX:+PrintCommandLineFlags ,我们自己设置的参数也被打印出来了
- -XX:+UseCompressedClassPointers -XX:+UseCompressedOops,JVM 自动启用了压缩指针(64位系统上的优化,节省内存)。
- -XX:-UseLargePagesIndividualAllocation
- -XX:+UseParallelGC,JVM 自动选择了并行垃圾收集器(Parallel GC)作为默认收集器。(这在JDK 8及之前是默认行为,高版本JDK默认可能是G1)
由上述 jvm 指令格式可知 classname 是必须参数,但是我们不需要运行某个类,只需要查看参数设置,那么添加 -version 参数可以告诉 JVM 不要尝试执行任何应用程序,只需显示版本信息然后退出
如果不加上 -version 会报如下错:
② java -XX:+PrintFlagsInitial
查看所有不稳定指令的默认值
③ java -XX:+PrintFlagsFinal
查看所有不稳定指令最终生效的实际值
④ 打印GC日志
命令如下:
java -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -jar yourapp.jar
- -XX:+PrintGC (或 -verbose:gc):表示开启简要 GC 日志。
- -XX:+PrintGCDetails:(强烈建议加上) 打印详细的 GC 信息,包括各区(Eden, Survivor, Old)在 GC 前后的内存使用情况。没有这个参数,日志信息会非常有限。
- -XX:+PrintGCDateStamps 或 -XX:+PrintGCTimeStamps:
- -XX:+PrintGCDateStamps:在日志中添加日期时间戳(如 2024-05-27T10:00:00.123+0800)。
- -XX:+PrintGCTimeStamps:在日志中添加从 JVM 启动开始计算的相对时间戳(如 12.345 秒)。生产环境推荐使用 PrintGCDateStamps。
- -Xloggc:<file_path>:(强烈建议加上) 将 GC 日志输出到文件,而不是控制台。例如 -Xloggc:/logs/gc.log。
增加高级设置
java -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause -XX:+PrintTenuringDistribution -Xloggc:gc.log -jar yourapp.jar
- -XX:+PrintGCCause:打印触发 GC 的原因(如 Allocation Failure, System.gc() 等)。这在 JDK 8 之后通常是默认开启的。
- -XX:+PrintTenuringDistribution:打印晋升年龄阈值(对象在 Survivor 区熬过多少次 GC 才能进入老年代)的信息,对调优 Survivor 区大小非常有帮助。
- -XX:+PrintHeapAtGC:在每次 GC 前后打印堆的详细信息。非常详细,但日志量会急剧增大,主要用于深度调试。
- -XX:+PrintReferenceGC:打印处理各种引用(软引用、弱引用、虚引用、Finalizer)的耗时。
⑤ 设置堆内存溢出时自动生成Dump文件
Dump 文件(转储文件)是计算机程序在特定时间点的状态快照,它记录了程序在发生错误、崩溃或特定触发条件时的内存内容、执行状态和系统信息,开发人员可以根据Dump文件事后分析到底发生了什么问题。
命令示例:
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -Xmx512m -jar yourapp.jar
- -XX:+HeapDumpOnOutOfMemoryError:启用堆内存溢出时自动生成 dump 文件的功能
- -XX:HeapDumpPath=
:指定 dump 文件的保存路径和文件名,可以指定文件名,也可以只指定目录,当只指定目录时,JVM 会自动生成文件名,格式为:java_pid.hprof