JVM

Java启动选项

Posted by kyle on March 7, 2019

启动Java程序的时候,有两种命令格式:

  • 1、java [options] classname [args]
  • 2、java [options] -jar filename [args]

第一种命令是让程序从某个类的Main方法开始启动,第二种命令则是让程序以jar包形式启动。

其中options里涉及到的一些参数与JVM调优息息相关。在这里,我整理了一些我个人比较感兴趣、也觉得以后可能会用得上的选项。

options所涉及的参数主要分为五大类:

  • 标准选项(Standard Options)
  • 非标准选项(Non-Standard Options)
  • 高级运行时选项(Advanced Runtime Options)
  • 高级JIT编译器选项(Advanced JIT Compiler Options)
  • 高级可维护性选项(Advanced Serviceability Options)
  • 高级垃圾回收选项(Advanced Garbage Collection Options)

标准选项(Standard Options)

标准选项保证能被所有JVM所实现,用来约束一些JVM的通用操作。比如检查JRE版本,指定class路径,输出更详细的命令信息等。

像-d32、-d64用来指定程序运行在32位环境还是64位环境,-client、-server用来指定即时编译器编译模式都属于这个范畴。

非标准选项(Non-Standard Options)

这类选项用来声明一些针对Java HotSpot VM的命令。

选项 功能描述
-Xbootclasspath:path 指定额外的启动类加载器,代替JDK里rt.jar中的启动类加载器
-Xdebug 以前我还以为这是用来开启调试模式。但是Oracle官方文档描述是:Does nothing. Provided for backward compatibility.也就是说这个选项是用来开启向后兼容的。
-Xint 让程序仅以解释模式运行,JIT编译器不介入工作
-Xcomp 优先采用编译方式执行程序(因为在某些场合无法完全由编译器承担工作)
-Xloggc:filename 输出GC事件日志
-Xmnsize 指定年轻代的初始大小
-Xmssize 指定堆的初始大小
-Xmxsize 指定堆的最大值
-Xsssize 指定线程栈大小

高级运行时选项(Advanced Runtime Options)

该类选项用来控制HotSpot VM的运行时行为。

选项 功能描述
-XX:ErrorFile=filename 当发生不可恢复的错误时,输出错误信息至指定文件
-XX:OnError=string 设定一个自定义的命令,当发生不可恢复的错误时,自动执行这个命令。例如:-XX:OnError=”gcore %p;dbx - %p”。当发生错误时,用gcore工具创建内核镜像,然后启动调试器追踪进程
-XX:OnOutOfMemoryError=string 与-XX:OnError类似,当发生内存溢出错误时执行特定命令

高级JIT编译器选项(Advanced JIT Compiler Options)

这类命令用来控制动态即时(JIT)编译。

选项 功能描述
-XX:+AggressiveOpts 使用激进的性能优化特性
-XX:CodeCacheMinimumFreeSpace=size 设定编译所需的最小空闲空间,当小于这个最小值,会停止即时编译
-XX:+Inline 用方法内联进行编译优化
-XX:+PrintCompilation 在控制台中输出编译信息

高级可维护性选项(Advanced Serviceability Options)

这类命令在维护程序运行的过程中有着巨大的作用。可以用来获取系统信息以及进行大范围的调试。

选项 功能描述
-XX:+HeapDumpOnOutOfMemoryError 当发生内存溢出错误时,在当前目录以HPROF(Heap Profiler)文件的形式导出堆的使用情况
-XX:HeapDumpPath=path 指定HPROF文件的输出路径
-XX:+PrintClassHistogram 可以通过触发Control + Break组合键来打印类实例信息
-XX:+PrintConcurrentLocks 可以通过触发Control + Break组合键来打印JUC加锁信息

高级垃圾回收选项(Advanced Garbage Collection Options)

这类选项控制GC的执行策略。

选项 功能描述
-XX:+AggressiveHeap 激进的堆优化策略,可以长时间运行的任务有更紧凑的内存分配
-XX:CMSTriggerRatio=percent 指定开始执行CMS垃圾回收的比率(相对于-XX:MinHeapFreeRatio选项所分配值的比率)
-XX:ConcGCThreads=threads 指定用来执行并发GC的线程数
-XX:+DisableExplicitGC 禁用显式地调用System.gc()来执行垃圾回收
-XX:+ExplicitGCInvokesConcurrent 允许通过显式地调用System.gc()并行地执行垃圾回收,默认仅与-XX:+UseConcMarkSweepGC同时启用
-XX:G1HeapRegionSize=size 设置G1算法分区的大小,值从1MB~32MB
-XX:+G1PrintHeapRegions 打印G1算法中区域的分配与回收信息
-XX:InitialHeapSize=size 设置内存分配池的初始大小
-XX:InitialSurvivorRatio=ratio 设置吞吐量垃圾回收器中初始生存区(survivor space)的比率
-XX:InitiatingHeapOccupancyPercent=percent 设置开始执行并发垃圾回收的堆使用空间百分比
-XX:MaxGCPauseMillis=time 设置期望的最大GC中断时间,JVM将努力实现这个目标
-XX:MaxHeapSize=size 设置内存分配池的最大值
-XX:MaxHeapFreeRatio=percent 设定GC后堆中允许的空闲的最大百分比
-XX:MaxMetaspaceSize=size 设定元数据区的最大值
-XX:MaxNewSize=size 设定年轻代最大堆大小
-XX:MaxTenuringThreshold=threshold 设置用于GC大小调整的最大晋升年龄阈值。最大值是15。并行(吞吐量)收集器的默认值为15,CMS收集器的默认值为6
-XX:+PrintGC 打印GC日志
-XX:+PrintGCDetails 打印GC明细
-XX:+PrintTenuringDistribution 打印对象年龄信息
-XX:TLABSize=size 设置ThreadLocal分配缓存(TLAB)的初始大小
-XX:+UseConcMarkSweepGC 老年代使用CMS收集器
-XX:+UseG1GC 使用G1收集器
-XX:+UseParallelGC 年轻代使用Parallel Scavenge收集器(也被称为吞吐量收集器),会同时使-XX:+UseParallelOldGC生效
-XX:+UseParallelOldGC 老年代使用并行收集器,会同时使-XX:+UseParallelGC生效
-XX:+UseParNewGC 年轻代使用ParNew收集器
-XX:+UseSerialGC 年轻代使用Serial收集器

[1] Java HotSpot VM Options. https://www.oracle.com/technetwork/java/javase/tech/index.html