目录

JVM 启动参数

java 启动参数分类:

  • 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容
  • 非标准参数(-X),默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后兼容
  • 非Stable参数(-XX),此类参数各个JVM实现会有所不同,将来可能会随时取消,需要慎重使用

标准参数

1
java --help
用法:java [options] <主类> [args...]
           (执行类)
   或  java [options] -jar <jar 文件> [args...]
           (执行 jar 文件)
   或  java [options] -m <模块>[/<主类>] [args...]
       java [options] --module <模块>[/<主类>] [args...]
           (执行模块中的主类)
   或  java [options] <源文件> [args]
           (执行单个源文件程序)

 将主类、源文件、-jar <jar 文件>、-m 或
 --module <模块>/<主类> 后的参数作为参数
 传递到主类。

 其中,选项包括:

    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
    --class-path <目录和 zip/jar 文件的类搜索路径>
                  使用 : 分隔的, 用于搜索类文件的目录, JAR 档案
                  和 ZIP 档案列表。
    -p <模块路径>
    --module-path <模块路径>...
                  用 : 分隔的目录列表, 每个目录
                  都是一个包含模块的目录。
    -d <module name>
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|module|gc|jni]
                  为给定子系统启用详细输出
    --version     将产品版本输出到输出流并退出
    --help        将此帮助消息输出到输出流
    -X            将额外选项的帮助输出到错误流
    --help-extra  将额外选项的帮助输出到输出流
    -ea[:<程序包名称>...|:<类名>]
    -enableassertions[:<程序包名称>...|:<类名>]
                  按指定的粒度启用断言
    -da[:<程序包名称>...|:<类名>]
    -disableassertions[:<程序包名称>...|:<类名>]
                  按指定的粒度禁用断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -agentlib:<库名>[=<选项>]
                  加载本机代理库 <库名>, 例如 -agentlib:jdwp
                  另请参阅 -agentlib:jdwp=help
    -agentpath:<路径名>[=<选项>]
                  按完整路径名加载本机代理库
    -javaagent:<jar 路径>[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument
要为长选项指定参数, 可以使用 --<名称>=<值> 或 --<名称> <值>。

非标准参数 -X

X Command-line Options

1
java -X
    -Xlog:<opts>      配置或启用采用 Java 虚拟
                      机 (Java Virtual Machine, JVM) 统一记录框架进行事件记录。使用 -Xlog:help
                      可了解详细信息。
    -Xloggc:<file>    将 GC 状态记录在文件中(带时间戳)。
                      此选项已过时,可能会在
                      将来的发行版中删除。它将替换为 -Xlog:gc:<file>。
    -Xmixed           混合模式执行(默认值)
    -Xmn<size>        为年轻代(新生代)设置初始和最大堆大小
                      (以字节为单位)
    -Xms<size>        设置初始 Java 堆大小
    -Xmx<size>        设置最大 Java 堆大小
    -Xnoclassgc       禁用类垃圾收集
    -Xss<size>        设置 Java 线程堆栈大小
1
java -XX:+PrintFlagsFinal -version | grep HeapSize

初始 Java 堆大小 为物理内存的 1/64(最小 8 MB),最大为 1 GB 的物理内存大小

最大 Java 堆大小

  • server 模式下的时候才是 min(1G, 物理内存的四分之一) 64位OS为物理内存四分之一
  • client 模式 min(1G, 物理内存的四分之一)

-Xss 设置线程堆栈大小。线程堆栈是为每个 Java 线程分配的内存区域,供其内部使用。这是线程存储其本地执行状态的地方。

Format: -Xss<size>[g|G|m|M|k|K]

Platform Default
Windows x86_64 128 KB
Linux x86_64 256 KB

非 Stable 参数 -XX

HotSpot JVM 提供给了两个新的参数,在JVM启动后,在命令行中可以输出所有XX参数和值。

1
2
3
4
# 打印所有参数选项的默认值
java -XX:+PrintFlagsInitial
# or 打印所有参数选线在运行程序时的生效的值
java -XX:+PrintFlagsFinal  -version >> ~/Downloads/jvm-xx-params.txt
参数数据类型 参数名 默认值 说明
uintx InitialSurvivorRatio 8 Eden/Survivor 的比例为 8
uintx NewRatio 2 Old区/Young区的内存比例 默认2

垃圾回收的频率,耗时等信息,于是可以设置JVM参数 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./gc.log

1
java -Xms312m -Xmx312m -XX:MetaspaceSize=768m -XX:MaxMetaspaceSize=768m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:~/Downloads/gc.log -jar ~/workspace/spring-demo/target/app.jar &

GCeasy 是一款在线的GC日志分析器,可以通过GC日志分析进行内存泄露检测、GC暂停原因分析、JVM配置建议优化等功能。