启动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