基础 | JVM - [参数]

@

§1 JVM 参数分类

  • 标准参数(-)
    所有的 JVM 实现都必须实现这些参数的功能
    向后兼容

    -version
    -help
    

    详细信息参阅 (此信息为下面指令提供)
    在这里插入图片描述

  • 非标准参数(-X):
    默认jvm实现这些参数的功能,但并不保证所有jvm实现都满足
    不保证向后兼容

    -Xint
    -Xmixed
    

    下面指令提示:
    -X 选项是非标准选项。如有更改,恕不另行通知。
    在这里插入图片描述

  • 非Stable参数(-XX)
    此类参数各个jvm实现会有所不同
    将来可能会随时取消

    XX 参数主要分为两种

    • boolean 型
      通常写作 -XX:+xxx-XX:-xxx,表示开启或关闭 xxx,如:

      -XX:+PrintGCDetails
      -XX:-UseParallelGC
      
    • KV 型
      即键值对形式,通常写作 -XX:key=value,如:

      -XX:MetaspaceSize=20m
      

§2 参数查看

详细指令参考 基础 | JDK - [指令]

查看 java 进程号
jps -l


查看 JVM 所有参数的实际值
java -XX:+PrintFlagsFinal

字段依次为

  • 参数类型
  • 参数名
  • 是否被修改(= 表示默认值,:= 表示被修改)
  • 参数类别
    • product :官方支持, JVM内部选项
    • rw :可动态写入的.
    • C1:Client JIT 编译器
    • C2:Server JIT 编译器
    • pd:platform Dependent 平台独立
    • lp64:仅 64 位JVM
    • manageable:代表可以运行时修改
    • diagnostic:用于虚拟机debug的
    • experimental:非官方支持的

java -XX:+PrintFlagsFinal

查看 JVM 所有参数的初始值
java -XX:+PrintFlagsInitial

查看所有改动过的 XX 参数
jinfo -flags 进程号
Non-default VM flags 中参数是系统改动过的参数
Command line 中参数是认为改动过的参数
在这里插入图片描述

查看所有命令行参数
java -XX:+PrintCommandLineFlags
在这里插入图片描述

看具体某具体 XX 参数
jinfo -flag 参数名 进程号

在这里插入图片描述
在这里插入图片描述

查看具体 X 参数
无法直接查看,但可以通过查看堆的信息获取
jmap -heap 进程号
信息如下

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4219469824 (4024.0MB)
   NewSize                  = 88080384 (84.0MB)
   MaxNewSize               = 1406140416 (1341.0MB)
   OldSize                  = 176160768 (168.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 66060288 (63.0MB)
   used     = 9248656 (8.820205688476562MB)
   free     = 56811632 (54.17979431152344MB)
   14.000326489645337% used
From Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
To Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
PS Old Generation
   capacity = 176160768 (168.0MB)
   used     = 0 (0.0MB)
   free     = 176160768 (168.0MB)
   0.0% used

通过 java 代码查看内存

public static void main(String[] args) throws InterruptedException {
    System.out.println("JVM params");

    System.out.println(Runtime.getRuntime().freeMemory());
    System.out.println(Runtime.getRuntime().maxMemory());
    System.out.println(Runtime.getRuntime().totalMemory());
    TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
}

说明
freeMemory() + totalMemory() 是JVM 虚拟机从操作系统分配的内存

  • 如果配置了 -Xms 这俩值的和就是配置值
  • 如果没有配置 -Xms 这俩值的和就是比满足当前虚拟机运行再稍多一点
  • 这两部分的初始比例大约是 1:4,如下图
  • 这些内存中使用了的部分是 totalMemory(),没使用的是 freeMemory()
    在这里插入图片描述

maxMemory() 是允许 JVM 使用的最大的内存值

  • 相当于 -Xmx 配置值
  • 没配置时默认大约 1/4 物理内存

§3 标准参数

查看版本
-version
在这里插入图片描述
帮助
-help
在这里插入图片描述

§4 -X 参数

堆初始容量
-Xms
初始堆大小,默认约 1/64 物理内存
-XX:InitialHeapSize 等价,实际属于 XX 参数
为避免 JVM 内存忽高忽低,通常与 -Xmx 一致

堆最大容量
-Xmx
最大堆大小,默认约 1/4 物理内存
-XX:MaxHeapSize 等价,实际属于 XX 参数
为避免 JVM 内存忽高忽低,通常与 -Xms 一致

新生代容量
-Xmn
-XX:MaxNewSize 等价,实际属于 XX 参数
通常,Eden:From:To:Old = 8:1:1:20

栈容量
-Xss
单个线程栈的内存大小, 1M,与系统和硬件有关
-XX:ThreadStackSize 等价,实际属于 XX 参数,其值为 0 时表示使用默认数值
每个线程的栈的大小,不是总大小

§5 -XX 参数

元空间大小
-XX:MetaspaceSize
类似以前的永久代,用于实现 JVM 规范中的方法区
但元空间直接使用本地内存,不在虚拟机中,因此默认只受本地内存影响
但是,元空间默认大小 20 M 左右,频繁创建对象时容易出现 OOM:Metaspace
因此此参数可以设大,比如取值 1024m

直接内存大小
-XX:MaxDirectMemorySize
不同于 -XX:MetaspaceSize ,此参数可以是 NIO 拥有更多的 Direct Buffer Memory


输出 GC 日志
-XX:+PrintGCDetails
会在发生 GC 或 Full GC 时输出 GC 日志
GC 日志参考 基础 | JVM - [GC]

在这里插入图片描述
GC 日志如下图
在这里插入图片描述
FROM / TO 区比例
-XX:SruvivorRatio
实际值使用的是 Eden 对 FROM / TO 的倍数

-XX:SruvivorRatio=8 时,Eden:FROM:TO = 8:1:1 (默认比例)
-XX:SruvivorRatio=6 时,Eden:FROM:TO = 6:1:1

Eden 区比例
-XX:NewRatio
实际值使用的是 Old 对 Eden 的倍数

-XX:NewRatio=2 时,Old:Eden = 2:1 (默认比例)
-XX:NewRatio=1 时,Old:Eden = 1:1
传说
在默认的并行垃圾回收期配置下,一直使用默认配置,用户指定无效

最大对象年龄
-XX:MaxTenuringThreshold
指一个对象经历多少次垃圾回收后,若依然存活,则进入老年代
此值取值范围为 [0,15],默认 15

查看 JVM 所有参数的实际值
查看 JVM 所有参数的实际值

查看 JVM 所有参数的初始值
查看 JVM 所有参数的初始值

查看所有命令行参数
查看所有命令行参数

§6 典型配置案例

(16G 内存)
-XX:InitialHeapSize=128m
-XX:MaxHeapSize=4096m
-XX:MetaspaceSize=512m
-XX:ThreadStackSize=1m
-XX:+PrintGCDetails
(用于开启类指针压缩,默认开启)
-XX:+UseCompressedOops
-XX:+UseCompressedClassPointers

-XX:-UseLargePageIndividualAllocation
-XX:+PrintCommandLineFlags
(垃圾回收器)
-XX:+UseSerialGc
posted @ 2025-05-20 14:34  问仙长何方蓬莱  阅读(14)  评论(0)    收藏  举报