文章目录
1. JVM 的启动模式
1.1 -server 与 -client 参数
参数-server
指定JVM 以服务器模式启动,-client
则为客户端模式,其主要区别如下:
-
Client VM 初始堆空间会小一些,使用串行的垃圾回收器,其目标是让JVM的启动速度更快,但运行速度会比Server VM模式慢,默认使用轻量级的
c1编译器
。c1 采用的优化手段比较简单,因此编译的时间较短 -
Server VM 的初始堆空间会大一些,默认使用并行垃圾回收器,启动慢运行快,默认使用相对重量级的
c2 编译器
。c2 采用的优化手段复杂,因此编译时间长,但是在运行过程中性能更好 -
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% |