JVM基础知识—JVM常见的参数配置

JVM基础知识—JVM常见的参数配置JVM 参数调优一 JVM 参数类型 标配参数 X 参数 了解 XX 参数 重点 二 查看运行的 Java 程序 JVM 参数是否开启 具体值为多少 编写阻塞 Java 程序 jps l 得到进程号

大家好,欢迎来到IT知识分享网。

一. JVM参数类型

①. 标配参数

  1. -version java -version
  2. -help

②. X参数(了解)

在这里插入图片描述

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

③. XX参数(重点)

Boolean类型

  • 公式:-XX:+ 或者-某个属性 + 表示开启,-表示关闭
  • Case:-XX:-PrintGCDetails:表示关闭了GC详情输出
    在这里插入图片描述

在这里插入图片描述

key-value类型

  • 公式:-XX:属性key=属性value
  • 不满意初始值,可以通过下列命令调整
  • case:如何:-XX:MetaspaceSize=:查看Java元空间的值

在这里插入图片描述

在这里插入图片描述

二. 查看运行的Java程序,JVM参数是否开启,具体值为多少?

①. 编写阻塞Java程序

在这里插入图片描述

public class HelloGC { 
    public static void main(String[] args) throws InterruptedException { 
    System.out.println("hello GC"); Thread.sleep(Integer.MAX_VALUE); } } 

②. jps -l 得到进程号

jps -l 得到进程号

在这里插入图片描述

③. jinfo -flag

jinfo -flag PrintGCDetails 19832 然后查看是否开启PrintGCDetails这个参数

在这里插入图片描述

  • 上面提到了,-号表示关闭,即没有开启PrintGCDetails这个参数

④. 运行程序的时候配置JVM参数

下面我们需要在启动HelloGC的时候,增加 PrintGCDetails这个参数,需要在运行程序的时候配置JVM参数

在这里插入图片描述

然后在使用jinfo查看我们的配置

在这里插入图片描述

  • 我们看到原来的-号变成了+号,说明我们通过 VM Options配置的JVM参数已经生效了

⑤. jinfo -flags * 命令

使用 jinfo -flags * 命令,会把jvm的全部默认参数输出

在这里插入图片描述

⑥. JVM的XX参数之Xms,Xmx

两个经典参数:

  1. -Xms等价于-XX:InitialHeapSize,初始大小内存,默认物理内存1/64
  2. -Xmx等价于-XX:MaxHeapSize,最大分配内存,默认为物理内存1/4

三. 查看JVM默认参数

①. XX:+PrintFlagsInitial 主要是查看初始默认值

 java -XX:+PrintFlagsInitial -version java -XX:+PrintFlagsInitial(重要参数) 

在这里插入图片描述

②. -XX:+PrintFlagsFinal:表示修改以后,最终的值

  • 如果有 := 表示修改过的, = 表示没有修改过的

在这里插入图片描述

③. Xms 初始堆内存为,Xmx 最大堆内存为

public class HelloGC { 
    public static void main(String[] args) throws InterruptedException { 
    System.out.println("hello GC"); // 返回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"); } } 

在这里插入图片描述

  • Xms 初始堆内存为:物理内存的1/64
  • Xmx 最大堆内存为:系统物理内存的 1/4

④. -XX:+PrintCommandLineFlags 打印出JVM的默认的简单初始化参数

  • 使用 -XX:+PrintCommandLineFlags 打印出JVM的默认的简单初始化参数

在这里插入图片描述

⑤. -Xss:设计单个线程栈的大小

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

在这里插入图片描述

⑥. 生活常用调优参数

  1. -Xms:初始化堆内存,默认为物理内存的1/64,等价于 -XX:initialHeapSize
  2. -Xmx:最大堆内存,默认为物理内存的1/4,等价于-XX:MaxHeapSize
  3. -Xss:设计单个线程栈的大小,一般默认为512K~1024K,等价于 -XX:ThreadStackSize
 - 使用 jinfo -flag ThreadStackSize 会发现 -XX:ThreadStackSize = 0 - 这个值的大小是取决于平台的 - Linux/x64:1024KB - OS X1024KB - Oracle Solaris1024KB - Windows:取决于虚拟内存的大小 
  1. -Xmn:设置年轻代大小
  2. -XX:MetaspaceSize:设置元空间大小
    • 元空间的本质和永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存,因此,默认情况下,元空间的大小仅受本地内存限制。
  3. -Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal
    • 但是默认的元空间大小:只有20多M
    • 为了防止在频繁的实例化对象的时候,让元空间出现OOM,因此可以把元空间设置的大一些
  4. -XX:PrintGCDetails:输出详细GC收集日志信息
    GC
    Full GC

四. 常用基础参数PrintGCDetails回收前后对比讲解

  • -XX:+PrintGCDetails 输出详细GC收集日志信息
  • 设置参数 -Xms10m -Xmx10m -XX:+PrintGCDetails 运行以下程序
    在这里插入图片描述
 import java.util.concurrent.TimeUnit; public class PrintGCDetailsDemo { 
    public static void main(String[] args) throws InterruptedException { 
    byte[] byteArray = new byte[10 * 1024 * 1024]; TimeUnit.SECONDS.sleep(Integer.MAX_VALUE); } } 

在这里插入图片描述

GC在新生区 打印参数详情

在这里插入图片描述

Full GC大部分发生在养老区 打印参数详情

在这里插入图片描述

OOM 问题发生的原因:

  • 因为们通过 -Xms10m 和 -Xmx10m 只给Java堆栈设置了10M的空间,但是创建了50M的对象,因此就会出现空间不足,而导致出错
  • 同时在垃圾收集的时候,我们看到有两个对象:GC 和 Full GC
  • 当我们出现了老年代都扛不住的时候,就会出现OOM异常

五. -XX:SurvivorRatio

①. 新生代中 eden 和 S0、S1的空间比例,默认为 8:1:1

  • 调节新生代中 eden 和 S0、S1的空间比例,默认为 -XX:SuriviorRatio=8,Eden:S0:S1 = 8:1:1
  • 加入设置成 -XX:SurvivorRatio=4,则为 Eden:S0:S1 = 4:1:1
  • SurvivorRatio值就是设置eden区的比例占多少,S0和S1相同
  • Java堆从GC的角度还可以细分为:新生代(Eden区,From Survivor区合To Survivor区)和老年代

在这里插入图片描述

-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:SurvivorRatio=8 

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

②. Eden、SurvivorFrom复制到SurvivorTo,年龄 + 1

  • 首先,当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到SurvivorFrom去,当Eden区再次触发GC的时候会扫描Eden区合From区域,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域(如果对象的年龄已经到达老年的标准,则赋值到老年代区),通知把这些对象的年龄 + 1

③. 清空Eden、SurvivorFrom

  • 然后,清空Eden,SurvivorFrom中的对象,也即复制之后有交换,谁空谁是To

④. SurvivorTo和SurvivorFrom互换

  • 最后,SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区,部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认为15),最终如果还是存活,就存入老年代。

六. -XX:NewRatio

  • 配置年轻代new 和老年代old 在堆结构的占比
  • 默认: -XX:NewRatio=2 新生代占1,老年代2,年轻代占整个堆的1/3
  • XX:NewRatio=4:新生代占1,老年代占4,年轻代占整个堆的1/5,NewRadio值就是设置老年代的占比,剩下的1个新生代
  • 新生代特别小,会造成频繁的进行GC收集
    在这里插入图片描述
    在这里插入图片描述

七. -XX:MaxTenuringThreshold

在这里插入图片描述

  • 设置垃圾最大年龄,SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区,部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认为15),最终如果还是存活,就存入老年代
  • 这里就是调整这个次数的,默认是15,并且设置的值 在 0~15之间
  • 查看默认进入老年代年龄:jinfo -flag MaxTenuringThreshold 17344
  • -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻对象不经过Survivor区,直接进入老年代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大的值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概念

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/114694.html

(0)
上一篇 2025-12-07 12:26
下一篇 2025-12-07 12:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信