[转帖]JVM底层原理之标配参数、X和XX参数

jvm,底层,原理,标配,参数,xx · 浏览次数 : 0

小编点评

**XX参数总结参数名称含义默认值/备注** | 参数名 | 参数值 | 默认值 | 备注 | |---|---|---|---| | -Xms | Xms | 16G | 设置新生代最大时间 | | -Xmx | Xmx | 1.5x -Xms | 设置最大堆大小 | | -Xss | 0 | 使用默认值 | 每个线程的堆栈大小 | | -XX:+PrintFlagsFinal | true | true | 打印最终GC参数 | | -XX:+PrintCommandLineFlags | true | true | 打印命令行参数 | | -XX:+PrintGCGC日志输出和-XX:+PrintGCDetails同上 | false | false | 是否输出GC日志信息 | | -XX:+PrintGCTimeStamps | false | false | 是否输出GC时间戳 | | -XX:+PrintGCDetails | false | false | 是否输出GC详细信息 | | -XX:+PrintClassHistogram | false | false | 是否输出类加载过程的信息 | | -XX:+PrintClassHistogramBeforeFullGCFullGC | false | false | 是否输出类加载过程信息之前 full GC 的详细信息 | | -XX:+HeapDumpOnOutOfMemoryErrorOM | false | false | 是否生成OM dump文件时记录错误信息 | | -XX:HeapDumpPath | /path/to/heapdump.bin | 默认路径 | 设置OM dump 文件存储路径 |

正文

一、JVM的参数类型

(1)标配参数(以-开头)

   java -version

    

    java -help

    

    java -showversion

    

    在JDK各个版本之间稳定,很少有大的变化。

    [标准VM参数表]

参数名称描述默认值
-d32使用 32 位数据模型 (如果可用)
-d64使用 64 位数据模型 (如果可用)
-server选择 "server" VM默认 VM 是 server,因为您是在服务器类计算机上运。
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>用 : 分隔的目录,JAR 档案和 ZIP 档案列表,用于搜索类文件
-D<名称>=<值>设置系统属性
-verbose:[class或gc或jni]启用详细输出
-version输出产品版本并退出
-version:<值>Deprecated
-showversion输出产品版本并继续
-jre-restrict-search或-no-jre-restrict-searchDeprecated
-? -help输出此帮助消息
-X输出非标准选项的帮助
-ea[:<包名、类名>]断言
-enableassertions[:<包名、类名>]按指定的粒度启用断言
-da[:<包名、类名>]
-disableassertions[:<包名、类名>]禁用具有指定粒度的断言
-esa 或-enablesystemassertions启用系统断言
-dsa 或-disablesystemassertions禁用系统断言
-agentlib:<libname>[=<选项>]加载本机代理库 <libname>例如 -agentlib:hprof另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>使用指定的图像显示启动屏幕

(2)X参数(以-X开头)

  •  -Xint      解释执行

    

  •  -Xcomp 第一次使用就编译成本地代码(先编译)

    

  •  -Xmixed 混合模式(先编译后执行)--默认

    

(3)XX参数--只有类2种类型(以-XX开头)

    【1】Boolean类型XX参数    公式:-XX:+ 或者-XX:- 某个属性值(+表示开启,-表示关闭

       案例:

       1)是否打印GC收集细节
               -XX:+PrintGCDetails
               -XX:-PrintGCDetails
        2)是否使用串行垃圾收集器
               -XX:+UseSerialGC
               -XX:-UserSerialGC      

 代码验证:
    

       jps -l                                           表示查看java运行的进程号
       jinfo -flag PrintGCDetails  pid    表示查看JVM是否配置PrintGCDetails参数
       -XX:-PrintGCDetails                   减号表示没有配置PrintGCDetails参数

   配置JVM -XX:+PrintGCDetails参数
    
    重新启动main方法:
     
    【2】KV设值类型  公式:-XX: key(属性)= value(属性值)
          案例一: 查看-XX:MetaspaceSize=默认值大小
           -XX:MetaspaceSize=21807104(大约20.8MB)
           
          案例二:添加-XX:MetaspaceSize=1024m参数      
          查看-XX:MetaspaceSize=人工设置值大小
         -XX:MetaspaceSize=1073741824(1024MB)


         
         案例三:查看-XX:MaxTenuringThreshold=默认值大小
         -XX:MaxTenuringThreshold=15表示年轻代对象年龄达到15岁就会进入老年代

二、jinfo查看当前运行程序配置:公式:jinfo -flag 配置项 进程号

         案例:    查看JVM所有配置项(默认+人工配置)
         jinfo -flags 进程号
         Non-default VM flags表示JVM默认参数
         Command line表示人工配置参数
         

三、如何解释-Xms和-Xmx参数属于XX参数

   -Xms和-Xmx两个经典参数看起既不像Boolean类型XX参数,也不像KV设值类型XX参数。那为什么-Xms和-Xmx又属于XX参数?
       -Xms = -XX:InitialHeapSize
       -Xmx = -XX:MaxHeapSize
 

四、盘点家底JVM默认值

(1)第一种查看JVM默认值方式

       jinfo -flag 参数项 进程号
       jinfo -flags 进程号

(2)第二种查看JVM默认值方式

       公式:java -XX:+PrintFlagsInitial(查看jvm未更改的默认参数)
       公式:java -XX:+PrintFlagsFinal(查看jvm已经更改过的参数)
       :=表示jvm启动时候默认修改或者人工更改过的参数
       =表示jvm没有更改过的默认参数
    uintx InitialHeapSize   := 266338304      {product} 默认为操作系统64/1内存(我本机内存为16G)   

     
(3)-XX:+PrintFlagsFinal举例:运行java命令的同时打印jvm参数

(4)-XX:+PrintCommandLineFlags打印命令行参数

五、XX参数总结

参数名称含义默认值/备注
-Xms初始堆大小物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
-Xmx最大堆大小物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn新生代大小(jdk 1.4或以上版本)增大新生代后,将会减小老年代大小。此值对系统性能影响较大。Sun官方推荐配置为整个堆的3/8
-Xss每个线程的堆栈大小JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,可以带 K, M 或 G单位
-XX:ThreadStackSize同上0代表使用默认值,不能带单位
-XX:PermSize设置永久代初始值物理内存的1/64
-XX:MaxPermSize设置永久代最大值物理内存的1/4
-XX:NewRatio新生代(包括Eden和两个Survivor区)与老年代的比值(除去永久代)-XX:NewRatio=4表示新生代与老年代所占比值为1:4,新生代占整个堆栈的1/5,Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatioEden区与Survivor区的大小比值设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个新生代的1/10
-XX:LargePageSizeInBytes内存页的大小不可设置过大, 会影响Perm的大小=128m
-XX:+UseFastAccessorMethods原始类型的快速优化
-XX:+DisableExplicitGC关闭System.gc()这个参数需要严格的测试
-XX:MaxTenuringThreshold垃圾最大年龄如果设置为0的话,则新生代对象不经过Survivor区,直接进入老年代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象再新生代的存活时间,增加在新生代即被回收的概率,该参数只有在串行GC时才有效
-XX:+AggressiveOpts加快编译
-XX:+UseBiasedLocking锁机制的性能改善
-Xnoclassgc禁用垃圾回收
-XX:SoftRefLRUPolicyMSPerMB每兆堆空闲空间中SoftReference的存活时间1s
-XX:PretenureSizeThreshold对象超过多大是直接在老年代分配新生代采用Parallel Scavenge GC时无效,另一种直接在老年代分配的情况是大的数组对象,且数组中无外部引用对象.
-XX:TLABWasteTargetPercentTLAB占eden区的百分比1%
-XX:+CollectGen0FirstFullGC时是否先YGCfalse
-XX:+UseParallelGCFull GC采用parallel MSC见[GC参数][1]
-XX:+UseParNewGC设置新生代为并行收集可与CMS收集同时使用,JDK 5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值
-XX:ParallelGCThreads并行收集器的线程数此值最好配置与处理器数目相等,同样适用于CMS
-XX:+UseParallelOldGC老年代垃圾收集方式为并行收集(Parallel Compacting)这个是JAVA 6出现的参数选项
-XX:MaxGCPauseMillis每次新生代垃圾回收的最长时间(最大暂停时间)如果无法满足此时间,JVM会自动调整新生代大小,以满足此值.
-XX:+UseAdaptiveSizePolicy自动选择新生代区大小和相应的Survivor区比例设置此选项后,并行收集器会自动选择新生代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开
-XX:GCTimeRatio设置垃圾回收时间占程序运行时间的百分比公式为1/(1+n)
-XX:+ScavengeBeforeFullGCFull GC前调用YGCtrue
-XX:+UseConcMarkSweepGC使用CMS内存收集测试中配置这个以后, -XX:NewRatio=4的配置失效了,原因不明,所以此时新生代大小最好用-Xmn设置
-XX:+AggressiveHeap试图是使用大量的物理内存长时间大内存使用的优化,能检查计算资源(内存, 处理器数量,至少需要256MB内存
-XX:CMSFullGCsBeforeCompaction多少次后进行内存压缩由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低
-XX:+CMSParallelRemarkEnabled降低标记停顿
-XX+UseCMSCompactAtFullCollection在FullGC的时候对老年代的压缩CMS是不会移动内存的, 因此这个非常容易产生碎片,导致内存不够用,因此内存的压缩这个时候就会被启用。增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片
-XX:+UseCMSInitiatingOccupancyOnly使用手动定义初始化定义开始CMS收集禁止hostspot自行触发CMS GC
-XX:CMSInitiatingOccupancyFraction=70使用cms作为垃圾回收使用70%后开始CMS收集该值的设置需要满足以下公式CMSInitiatingOccupancyFraction计算公式
-XX:CMSInitiatingPermOccupancyFraction设置Perm Gen使用到达多少比率时触发92
-XX:+CMSIncrementalMode设置为增量模式用于单CPU情况
-XX:+CMSClassUnloadingEnabled永久代CMS方式GC
-XX:+PrintGCGC日志输出和-verbose:gc一样
-XX:+PrintGCDetails同上更详细
-XX:+PrintGCTimeStamps输出GC的时间戳配合上述PrintGC参数使用,或者写成-XX:+PrintGC:PrintGCTimeStamps类似的
-XX:+PrintGC:PrintGCTimeStamps可与-XX:+PrintGC -XX:+PrintGCDetails混合使用
-XX:+PrintGCApplicationStoppedTime打印垃圾回收期间程序暂停的时间。可与上面混合使用输出形式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:+PrintGCApplicationConcurrentTime打印每次垃圾回收前,程序未中断的执行时间可与上面混合使用,输出形式:Application time: 0.5291524 seconds
-XX:+PrintHeapAtGC打印GC前后的详细堆栈信息
-Xloggc:filename把相关日志信息记录到文件以便分析与上面几个配合使用
-XX:+PrintClassHistogram在控制台按下Ctrl+Break后,打印类的信息
-XX:+PrintClassHistogramBeforeFullGCFullGC前打印类信息
-XX:+PrintTLAB查看TLAB空间的使用情况
XX:+PrintTenuringDistribution查看每次minor GC后新的存活周期的阈值
-ea开启assert断言
-Xprof性能诊断
-Xrunhprof性能诊断
-XX:+TraceClassLoading打印类加载过程的信息类似 [Loaded java.util.AbstractList$Itr from /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/rt.jar]
-XX:+TraceClassUnloading打印类卸载的过程信息
Xbootclasspath指定加载不需要校验的类跳过必要的类加载前的校验,能够减少加载时间,但是不安全
-XX:+PrintCompilation打印Hotspot使用JIT 编译的方法名称
-XX:+HeapDumpOnOutOfMemoryErrorOM时生成heap dump默认输出在存放类文件的根文件夹
-XX:HeapDumpPath设置输出OM dump文件路径配合-XX:+HeapDumpOnOutOfMemoryError使用

        

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览84895 人正在系统学习中

与[转帖]JVM底层原理之标配参数、X和XX参数相似的内容:

[转帖]JVM底层原理之标配参数、X和XX参数

一、JVM的参数类型 (1)标配参数(以-开头) java -version java -help java -showversion 在JDK各个版本之间稳定,很少有大的变化。 [标准VM参数表] 参数名称描述默认值-d32使用 32 位数据模型 (如果可用)/-d64使用 64 位数据模型 (如

[转帖]【JVM系列JKD8】参数参考表

JVM是Java底层核心要素,可以说Java生态的东西都是运行在JVM里面的。From:https://docs.oracle.com/javase/8/docs/ JVM参数的含义 JVM参数说明 参数名称含义默认值-Xms初始堆大小物理内存的1/64(<1GB)默认(MinHeapFreeRat

[转帖]JVM系列之:关于即时编译器的那些事

本文为《深入学习 JVM 系列》第十六篇文章 我们在前文学习 Java 是如何执行的这篇文章中有提及即时编译器,这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码,直接运行在底层硬件之上。 那么问题来了,既然在 Ho

[转帖]JVM——内存区域:运行时数据区域详解

https://www.jianshu.com/p/cded765cfd1b 关注:CodingTechWork,一起学习进步。 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象、一个是面向过程编程以外,我们还会从底层内存管理和垃圾收集方面作出比较。 对于C++

[转帖]Kafka 核心技术与实战学习笔记(六)kafka线上集群部署方案

一.操作系统-Linux Kafka是JVM系的大数据框架kafka由Scala语言和Java语言编写而成,编译之后的源代码就是普通的".class"文件 使用Linux kafka客户端底层使用Java的selector,selector在Linux上的实现机制是epoll,由于在windows上

[转帖]【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列

【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列 作者:冰河 2022-11-04 四川 本文字数:13519 字 阅读完需:约 44 分钟 写在前面 最近,一直有小伙伴让我整理下关于 JVM 的知识,经过十几天的收集与整理,初版算是整理出来了。希望对大家有所帮助。 JDK 是

[转帖]JVM metaspace outofmemory

https://www.jianshu.com/p/1ca44f94e42f 解决服务器进程退出问题(metaspace溢出) 现象 策划反应服务器进不去,远程看了一下进程消失了(crash) 有时候也会出现能登录,但是无法执行操作(进程还在),无法被正常shutdown 进程根目录下出现了java

[转帖]JVM内存非典型术语介绍(shallow/retained/rss/reserved/committed)

https://www.jianshu.com/p/871d6bb3a32d JVM内存非典型术语介绍(shallow/retained/rss/reserved/committed) 背景 ​ 在服务器性能优化内存这一项时,有一些现象很诡异。如top显示的RES很大,但是实际jvm堆内存占用很小,

[转帖]jvm crash when overwritten running jar

https://www.jianshu.com/p/bf0a051e4c63 现象 策划热更完配置表后 jvm直接就crash了(开发机linux) crash日志 日志分析 从crash日志看是reload配置表 使用Reflections扫描配置类 最终读取jar包 java.util.zip.

[转帖]jvm一般相关配置OutOfMemoryError关参数配置解释

一般运行java应用都会根据实际情况设置一些jvm相关运行参数 特别是有关内存和oom溢出等参数,方便后续问题定位和解决 如常用的以下配置 nohup java -Xms256m -Xmx24g -Xmn8g -verbose:gc -XX:+PrintGCDateStamps -XX:+Print