JVM 命令指北(1)-参数大全

1. JVM 的启动模式

1.1 -server 与 -client 参数

参数-server 指定JVM 以服务器模式启动,-client则为客户端模式,其主要区别如下:

  1. Client VM 初始堆空间会小一些,使用串行的垃圾回收器,其目标是让JVM的启动速度更快,但运行速度会比Server VM模式慢,默认使用轻量级的c1编译器。c1 采用的优化手段比较简单,因此编译的时间较短

  2. Server VM 的初始堆空间会大一些,默认使用并行垃圾回收器,启动慢运行快,默认使用相对重量级的c2 编译器。c2 采用的优化手段复杂,因此编译时间长,但是在运行过程中性能更好

  3. JVM在启动的时候会根据硬件和操作系统自动选择使用Server还是Client类型的JVM

    - 32位操作系统
       - Windows系统,不论硬件配置如何,都默认使用Client类型的JVM
       - 其他操作系统上,机器配置有2GB以上的内存同时有2个以上CPU则默认使用server模式,否则使用client模式
    
    - 64位操作系统
       - 只有server类型,不支持client类型
    

1.2 执行模式

1.2.1 解释执行与编译执行

  • 解释执行
    将编译好的字节码一行一行地翻译为机器码执行,优势在于不用等待
  • 编译执行
    以方法为单位,将字节码一次性翻译为机器码后执行,实际运行当中效率更高

1.2.2 参数 -Xint、-Xcomp、-Xmixed

  • -Xint 解释模式(interpreted mode)
    强制JVM解释执行所有的字节码,这会降低运行速度,通常低10倍或更多

  • -Xcomp 编译模式(compile mode)
    JVM在第一次使用时会把所有的字节码编译成机器码,从而带来最大程度的优化。不过使用 -Xcomp 也会有一些性能损失,因为该模式没有让JVM启用JIT编译器的全部功能。JIT编译器可以对代码是否需要编译做判断,如果某些代码只执行一次,那就没必要对其进行编译

  • -Xmixed 混合模式(mixed mode)
    将解释模式与编译模式进行混合使用,由JVM自行决定采用哪种,是JVM默认的模式,也是推荐使用的模式

2. JVM 主要参数

JVM 的参数类型分为三类,分别是 :

  • 标准参数
    -help,-version
  • -X参数(非标准参数)
    -Xint,-Xcomp
  • -XX参数(使用率较高)
    -XX:newSize,-XX:+UseSerialGC

2.1 -X 参数

安装 JDK 后在终端中使用命令 java -X 即可查看部分虚拟机参数,某些参数与操作系统相关

参数 功能
-Xmixed 混合模式执行 (默认)
-Xint 仅解释模式执行
-Xbootclasspath 设置搜索路径以引导类和资源
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xverify:none 关闭字节码文件验证,有风险
-Xloggc:< file > 将 GC 状态记录在文件中 (带时间戳)
-Xbatch 禁用后台编译
-Xms < size > 设置初始 Java 堆大小
-Xmx< size > 设置最大 Java 堆大小
-Xss< size > 设置 Java 线程堆栈大小
-Xprof 输出 cpu 配置文件数据
-Xfuture 启用最严格的检查, 预期将来的默认值
-Xrs 减少 Java/VM 对操作系统信号的使用
-Xcheck:jni 对 JNI 函数执行其他检查
-Xshare:off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据 (默认)
-Xshare:on 要求使用共享类数据, 否则将失败。
-XshowSettings:all 显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties 显示所有属性设置并继续
-XshowSettings:locale 显示所有与区域设置相关的设置并继续

2.2 -XX 参数

-XX 参数主要用于 JVM 的调优和 debug 操作,通常在 JVM 启动时指定或者写在 JVM 的配置文件里,无法在终端直接使用。其命令格式有2种,一种是行为类型,一种是属性设置类型:

  • 行为类型
    格式 :-XX:[ + -]< name > 表示启用禁用属性
    -XX:+DisableExplicitGC启用禁止手动调用gc操作,也就是调用System.gc()无效
  • 属性设置类型
    格式 :-XX:< name >=< value > 表示设置< name >属性值为< value >
    -XX:NewRatio=1 表示设置老年代和新生代的内存比值

2.2.1 性能相关参数

参数及其默认值 功能
-XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
-XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
-XX:+AggressiveOpts 加快编译
-XX:+UseBiasedLocking 锁机制的性能改善
-XX:PretenureSizeThreshold 对象超过多大时直接在老年代分配
-XX:MaxPermSize=64m 永久代对象能占用内存的最大值
-XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
-XX:NewRatio=4 设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=8 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
-XX:ReservedCodeCacheSize=32m 保留代码占用的内存容量
-XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
-XX:+UseLargePages 使用大页面内存
-XX:MaxTenuringThreshold=15 对象晋升老年代的年龄阀值
-XX:HandlePromotionFailure=true 允许空间分配担保失败

2.2.2 调试相关参数

参数及其默认值 功能
-XX:+CITime 打印消耗在JIT编译的时间
-XX:ErrorFile=./hs_err_pid< pid >.log 保存错误日志或者数据到文件中
-XX:+ExtendedDTraceProbes 开启solaris特有的dtrace探针
-XX:HeapDumpPath=./java_pid< pid >.hprof 指定导出堆信息时的路径或文件名
-XX:+HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
-XX:OnError="< cmd args>;< cmd args>" 出现致命ERROR之后运行自定义命令
-XX:OnOutOfMemoryError="< cmd args>;< cmd args>" 当首次遭遇OOM时执行自定义命令
-XX:+PrintClassHistogram 遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
-XX:+PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
-XX:+PrintCommandLineFlags 打印在命令行中出现过的标记
-XX:+PrintCompilation 当一个方法被编译时打印相关信息
-XX:+TraceClassLoading 跟踪类的加载信息
-XX:+TraceClassLoadingPreorder 跟踪被引用到的所有类的加载信息
-XX:+TraceClassResolution 跟踪常量池
-XX:+TraceClassUnloading 跟踪类的卸载信息
-XX:+TraceLoaderConstraints 跟踪类加载器约束的相关信息

2.2.3 辅助信息相关参数

参数 功能 输出式例
-XX:+PrintGC 输出GC信息 [GC 118250K->113543K(130112K), 0.0094143 secs]
-XX:+PrintGCDetails 输出GC详细信息 [GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
-XX:+PrintGCTimeStamps 添加时间戳,可与-XX:+PrintGC 及-XX:+PrintGCDetails混合使用 11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
-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:+PrintTLAB 查看TLAB空间的使用情况
XX:+PrintTenuringDistribution 查看每次minor GC后新的对象存活周期的阈值 Desired survivor size 1048576 bytes, new threshold 7 (max 15),new threshold 7即标识新的对象存活周期的阈值为7

Refer G1 相关参数

参数 功能
-XX:+UseG1GC 启用 G1 垃圾收集器
-XX:G1HeapRegionSize 指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区
-XX:GCTimeRatio 吞吐量大小,0-100的整数(默认9),值为n则系统将花费不超过1/(1+n)的时间用于垃圾收集
-XX:MaxGCPauseMillis 目标暂停时间(默认200ms)
-XX:G1NewSizePercent 新生代内存初始空间(默认整堆5%)
-XX:G1MaxNewSizePercent 新生代内存最大空间
-XX:TargetSurvivorRatio:Survivor 填充容量(默认50%)
-XX:InitiatingHeapOccupancyPercen 老年代占用空间超过整堆比IHOP阈值(默认45%),超过则执行混合收集
-XX:G1HeapWastePercent 堆垃圾百分比(默认5%)
-XX:G1MixedGCCountTarget = 8 设置在标记周期完成之后混合收集的次数(默认为8),以维持old region(也就是老年代)中,最多有G1MixedGCLiveThresholdPercent的存活对象。
-XX:G1OldCSetRegionThresholdPercent = 10 设置在一次混合收集中被收集的old region数量的上限,默认值是整个堆的10%
-XX:G1ReservePercent = 10 设置预留空闲内存百分比,以降低内存溢出的风险。默认值为10%
发布了97 篇原创文章 · 获赞 88 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45505313/article/details/102872313
今日推荐