Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

    • Java基础

    • Java进阶

    • Java容器

    • Java并发编程

    • Java虚拟机

      • JVM与Java体系结构
      • JVM内存区域详解
      • JVM类的加载过程详解
      • JVM创建对象过程
      • JVM垃圾回收详解
      • JVM参数设置
        • 1. 一些命令
        • 2. JVM的参数类型
        • 3. 经典参数-Xms、-Xmx
        • 4. 经典参数 -Xss
        • 5. 经典参数 -Xmn
        • 6. 经典参数 -XX:MetaspaceSize
        • 7. 经典参数 -XX:+PrintGCDetails
        • 8. 经典参数 -XX:SurvivorRatio
        • 9. 经典参数 -XX:NewRatio
        • 10. 经典参数 -XX:MaxTenuringThreshold
        • 11. 经典设置案例
        • 12. 盘点JVM默认值
      • JVM性能调优工具
      • 内存泄漏与内存溢出
    • 常见面试题

  • 计算机基础

  • 框架|中间件

  • 架构

  • 后端
  • Java
  • Java虚拟机
Marvel
2022-07-13
目录

JVM参数设置

# JVM参数设置

# 1. 一些命令

📌 jps:查看java后台进程

输入命令:jps -l

控制台输出:

14416 sun.tools.jps.Jps
14964
18388 test.HelloGC
15500 org.jetbrains.idea.maven.server.RemoteMavenServer36
1
2
3
4

📌 jinfo:查看正在运行java程序的各种信息

命令:jinfo -flag 配置项 进程编号 、jinfo -flags 进程编号

输入命令:jinfo -flag PrintGCDetails 13632

解释:查看13632 Java进程是否开启PrintGCDetails

控制台输出:

-XX:-PrintGCDetails
1

输入命令:jinfo -flags 13632

解释:查看13632 Java进程所有参数的值

控制台输出:

Attaching to process ID 13632, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.321-b07
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4284481536 -XX:MaxNewSize=1428160512 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+PrintGCDetails -XX:+UseCompr
essedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -XX:+PrintGCDetails -javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\lib\idea_rt.jar=59267:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\bin -Dfile.encoding=UTF-8
1
2
3
4
5
6
7

说明:

Non-default VM flags:系统默认的参数

Command line:人为修改的

📌 设置JVM参数

菜单栏Run——Edit Configurations (若没有,可以同Modify options调出来)

image-20220619201231990

📌 查看JVM默认值的方法

1 使用jps命令查看正在运行的线程

2 使用jinfo命令查看具体线程某一参数的值

# 2. JVM的参数类型

java代码到运行:先用javac编译,再java运行。

💎 标配参数

java -version
Java -help
java -showversion
1
2
3

💎 x参数(了解)

-Xint 解释执行
-Xcomp 第一次使用就编译成本地代码
-Xmixed 混合模式(先编译,再执行)
1
2
3

💎 xx参数(重点)

⚙ boolean类型

公式:-XX:+ 或者 - 某个属性值; + 表示开启; -表示关闭

案例:

查看13632进程是否开启PrintGCDetails

输入:jinfo -flag PrintGCDetails 13632

输出:-XX:-PrintGCDetails 表示没有开启

设置开启的方法:设置VM参数-XX:+PrintGCDetails

参数案例:

是否打印GC收集细节

使用:-XX:-PrintGCDetails

不使用:-XX:+PrintGCDetails

是否使用串行垃圾回收器

使用:-XX:-UseSerialGC

不使用:-XX:+UseSerialGC

⚙ KV数值类型

公式:-XX:属性key=属性值value

案例:

查看Java线程8576元空间大小:jinfo -flag MetaspaceSize 8576 输出:-XX:MetaspaceSize=21807104,元空间默认大小21MB

参数案例:

设置元空间大小:-XX:MetaspaceSize=128m

升级到老年区的阈值:-XX:MaxTenuringThreshold=15

# 3. 经典参数-Xms、-Xmx

🔑 -Xms等价于-XX:InitialHeapSize

表示初始化堆大小,一旦对象容量超过堆的初始容量,JAVA堆会自动扩容到-Xmx大小。

默认值为物理内存的1/64

🔑 -Xmx等价于-XX:MaxHeapSize

表示堆可以扩展到的最大值,在很多情况下,通常将-Xms和-Xmx设置成一样的,因为当堆不够用而发生扩容时,会发生内存抖动影响程序运行时的稳定性。每次 jvm 向操作系统申请内存时都需要一定的开销,需要占用 CPU 时间。

默认值为物理内存的1/4

元空间大小默认值为本地内存的1/4

⌨ 通过程序获得参数值

public static void main(String[] args) throws InterruptedException {
    // Java虚拟机内存总量
    long totalMemory = Runtime.getRuntime().totalMemory();
    // java虚拟机试图使用的最大内存
    long maxMemory = Runtime.getRuntime().maxMemory();

    System.out.println("TOTAL_MEMORY(-Xms) = " + totalMemory + " (字节)、" + (totalMemory / (double) 1024 / 1024) + "MB");
    System.out.println("MAX_MEMORY(-Xmx) = " + maxMemory + " (字节)、" + (maxMemory / (double) 1024 / 1024) + "MB");
}
1
2
3
4
5
6
7
8
9

# 4. 经典参数 -Xss

等价于-XX:ThreadStackSize

设置方法:-Xss128k

设置单个线程栈的大小,一般默认值为512k~1024k

# 5. 经典参数 -Xmn

设置年轻代大小

# 6. 经典参数 -XX:MetaspaceSize

设置元空间大小

元空间的本质和永久代类似,都是堆JVM规范中方法区的实现。

区别:元空间不再虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。

# 7. 经典参数 -XX:+PrintGCDetails

输出详细GC收集日志信息

Yong GC 案例

image-20220620215952170

Full GC 案例

image-20220620220513101

规律:GC前内存占用->GC后内存占用 (该内存总大小)

# 8. 经典参数 -XX:SurvivorRatio

设置新生代中eden/S0/S1空间的比例,SurvivorRatio值就是设置eden区的比例占多少,S0/S1相同

默认:-XX:SurvivorRatio=8, Eden:S0:S1 = 8:1:1

设置:-XX:SurvivorRatio=4, Eden:S0:S1 = 4:1:1

image-20220620220935477

# 9. 经典参数 -XX:NewRatio

配置年轻代和老年代再堆结构的占比

默认:-XX:NewRatio=2 新生代:老年代=1:2

设置:-xx:NewRatio=4 新生代:老年代=1:4

# 10. 经典参数 -XX:MaxTenuringThreshold

垃圾进入老年代的年龄

默认:-XX:MaxTenuringThreshold=15

设置:-XX:MaxTenuringThreshold=12

注意:范围为0~15,因为对象头只有4位用于存储年龄,最大值为1111b

image-20220620222235303

# 11. 经典设置案例

-Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
1

# 12. 盘点JVM默认值

🔎 查看初始值:java -XX:+PrintFlagsInitial

E:\java\code\studyNote\java\target\classes\lsq>java -XX:+PrintFlagsInitial
[Global flags]
     intx ActiveProcessorCount                      = -1                                  {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
    uintx AdaptiveSizePausePolicy                   = 0                                   {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50                                  {product}
    uintx AdaptiveSizePolicyInitializingSteps       = 20                                  {product}
    uintx AdaptiveSizePolicyOutputInterval          = 0                                   {product}
    uintx AdaptiveSizePolicyWeight                  = 10                                  {product}
    uintx AdaptiveSizeThroughPutPolicy              = 0                                   {product}
    uintx AdaptiveTimeWeight                        = 25                                  {product}
     bool AdjustConcurrency                         = false                               {product}
     bool AggressiveHeap                            = false                               {product}
     bool AggressiveOpts                            = false                               {product}
	...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

=:表示JVM默认加载的值

查看修改更新:java -XX:+PrintFlagsFinal

:=:表示修改过的值(JVM自己修改或是认为修改)

🔎 设置属性运行Java代码,并查看jvm属性值:

java -XX:+PrintFlagsFinal -Xms128k java程序

🔎 查看默认值:java -XX:+PrintCommandLineFlags -version

输出:

-XX:InitialHeapSize=267755904 -XX:MaxHeapSize=4284094464 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)
1
2
3
4

可以查看到堆的大小、默认垃圾回收器等。

编辑 (opens new window)
#Java#JVM
上次更新: 2023/08/20, 21:21:52
JVM垃圾回收详解
JVM性能调优工具

← JVM垃圾回收详解 JVM性能调优工具→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式