Java虚拟机之JVM启动参数大全
说明
本文所有的参数是基于JDK7的HotSpot虚拟机,适用于JDK7及以前版本,JDK7后续版本参数是否有效请自测。
对于启用或关闭功能选项:-XX:+<option>打开某功能;-XX:-<option>关闭某功能;
对于数字型选项:-XX:<option>=<number>,若需要表示大小,可在数字后添加k、m、g;
对于字符串选项:-XX:<option>=<string>,用于指定文件,路径或命令列表;
参数列表
功能选项
参数与默认值 | 描述 |
---|---|
-XX:-AllowUserSignalHandlers | 允许使用用户自定义的信号处理器 (只对应Solaris和Linux) |
-XX:AltStackSize=16384 | 修改栈容量 (单位 Kb) (对应Solaris, JDK 5.0以后弃用) |
-XX:-DisableExplicitGC | 禁止手动调用System.gc() |
-XX:+FailOverToOldVerifier | 如果新的类型校验器验证失败使用旧版本的类型校验器 (开始于JDK6.) |
-XX:+HandlePromotionFailure | 关闭新生代收集担保(java5以前是默认不启用,java6默认启用) |
-XX:+MaxFDLimit | 将文件描述符加到最大 (对应Solaris) |
-XX:PreBlockSpin=10 | 控制多线程自旋锁优化的自旋次数 |
-XX:-RelaxAccessControlCheck | 放宽类型校验机的准入控制(JDK6) |
-XX:+ScavengeBeforeFullGC | 在full GC之前先做年轻代GC (开始于JDK1.4.1.) |
-XX:+UseAltSigs | 为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代 SIGUSR1和SIGUSR2(限于Solaris) |
-XX:+UseBoundThreads | 绑定所有的用户线程到内核线程, 减少线程进入饥饿状态(得不到任何cpu time)的次数(限于Solaris) |
-XX:-UseConcMarkSweepGC | 使用并发的mark-sweep GC收集年老代 (始于JDK1.4.1) |
-XX:+UseGCOverheadLimit | 使用一种限制VM做GC操作的时间所占比例过高的策略 (始于JDK6.) |
-XX:+UseLWPSynchronization | 使用轻量级进程同步替代线程同步 (始于JDK1.4.0. Solaris相关) |
-XX:-UseParallelGC | 使用并发平行GC(始于JDK1.4.1) |
-XX:-UseParallelOldGC | 使用并发平行GC做 full GC. (始于JDK5.0 update 6.) |
-XX:-UseSerialGC | 使用串行GC (始于JDK5.0.) |
-XX:-UseSpinning | 启用多线程自旋锁优化(java1.4.2和1.5需要手动启用) |
-XX:+UseTLAB | 启用线程本地缓存区(1.4.2以前和使用-client选项时,默认不启用,其余版本默认启用) |
-XX:+UseSplitVerifier | 使用新的Class类型校验器(java5默认不启用, java6默认启用) |
-XX:+UseThreadPriorities | 使用本地线程的优先级 |
-XX:+UseVMInterruptibleIO | 在solaris中,允许运行时中断线程(限于solaris) |
G1垃圾收集器选项
参数与默认值 | 描述 |
---|---|
-XX:+UseG1GC | 使用G1垃圾处理器 |
-XX:MaxGCPauseMillis=n | 设置并行收集最大暂停时间,这是一个理想目标,JVM将尽最大努力来实现它 |
-XX:InitiatingHeapOccupancyPercent=n | 启动一个并发垃圾收集周期所需要达到的整堆占用比例。这个比例是指整个堆的占用比例而不是某一个代(例如G1),如果这个值是0则代表‘持续做GC’。默认值是45 |
-XX:NewRatio=n | 设置年轻代和年老代的比值。例如:值为3,则表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 |
-XX:SurvivorRatio=n | 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 |
-XX:MaxTenuringThreshold=n | 设置垃圾最大存活阀值。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论 |
-XX:ParallelGCThreads=n | 配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等 |
-XX:ConcGCThreads=n | 并发垃圾收集器线程数 |
-XX:G1ReservePercent=n | 设置保留用来做假天花板以减少晋升(新生代对象晋升到老生代)失败可能性的堆数目 |
-XX:G1HeapRegionSize=n | 使用G1垃圾回收器,java堆被划分成统一大小的区块。这个选项设置每个区块的大小。最小值是1Mb,最大值是32Mb |
性能选项
参数与默认值 | 描述 |
---|---|
-XX:+AggressiveOpts | 启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等(JDK 5 update 6后引入,但需要手动启用, JDK6默认启用) |
-XX:CompileThreshold=10000 | 通过JIT编译器,将方法编译成机器码的触发阀值,可以理解为调用方法的次数,例如调1000次,将方法编译为机器码 |
-XX:LargePageSizeInBytes=4m | 设置堆内存的内存页大小 |
-XX:MaxHeapFreeRatio=70 | GC后,如果发现空闲堆内存占到整个预估上限值的70%,则收缩预估上限值 |
-XX:MaxNewSize=size | 新生代占整个堆内存的最大值 |
-XX:MaxPermSize=64m | Perm(俗称方法区)占整个堆内存的最大值 |
-XX:MinHeapFreeRatio=40 | GC后,如果发现空闲堆内存占到整个预估上限值的40%,则增大上限值 |
-XX:NewRatio=2 | 新生代和年老代的堆内存占用比例, 例如2表示新生代占年老代的1/2,占整个堆内存的1/3 |
-XX:NewSize=2m | 新生代预估上限的默认值 |
-XX:ReservedCodeCacheSize=32m | 设置代码缓存的最大值,编译时用 |
-XX:SurvivorRatio=8 | Eden与Survivor的占用比例 |
-XX:TargetSurvivorRatio=50 | 实际使用的survivor空间大小占比。默认是50%,最高90% |
-XX:ThreadStackSize=512 | 线程堆栈大小 |
-XX:+UseBiasedLocking | 启用偏向锁 |
-XX:+UseFastAccessorMethods | 优化原始类型的getter方法性能(get/set:Primitive Type) |
-XX:-UseISM | 启用solaris的ISM |
-XX:+UseLargePages | 启用大内存分页 |
-XX:+UseMPSS | 启用solaris的MPSS,不能与ISM同时使用 |
-XX:+UseStringCache | 启用缓存常用的字符串 |
-XX:AllocatePrefetchLines=1 | 在使用JIT生成的预读取指令分配对象后读取的缓存行数。如果上次分配的对象是一个实例则默认值是1,如果是一个数组则是3 |
-XX:AllocatePrefetchStyle=1 | 预读取指令的生成代码风格0- 无预读取指令生成 1-在每次分配后执行预读取命令 2-当预读取指令执行后使用TLAB()分配水印指针来找回入口 |
-XX:+UseCompressedStrings | 其中,对于不需要16位字符的字符串,可以使用byte[] 而非char[]。对于许多应用,这可以节省内存,但速度较慢(5%-10%) |
-XX:+OptimizeStringConcat | 优化字符串连接操作在可能的情况下 |
调试选项
参数与默认值 | 描述 |
---|---|
-XX:-CITime | 打印发费在JIT编译上的时间 |
-XX:ErrorFile=./hs_err_pid<pid>.log | 错误文件 |
-XX:-ExtendedDTraceProbes | 启用性能的影响DTrace探测器 |
-XX:HeapDumpPath=./java_pid<pid>.hprof | 指定HeapDump的文件路径或目录 |
-XX:-HeapDumpOnOutOfMemoryError | 当抛出OOM时进行HeapDump |
-XX:OnError="<cmd args>;<cmd args>" | 当发生错误时执行用户指定的命令 |
-XX:OnOutOfMemoryError="<cmd args>; <cmd args>" | 当发生OOM时执行用户指定的命令 |
-XX:-PrintClassHistogram | 当Ctrl+Break发生时打印Class实例信息,与jmap -histo相同 |
-XX:-PrintConcurrentLocks | 当Ctrl+Break发生时打印java.util.concurrent的锁信息, 与jstack -l相同 |
-XX:-PrintCommandLineFlags | 打印命令行上的标记 |
-XX:-PrintCompilation | 当方法被编译时打印信息 |
-XX:-PrintGC | 当GC发生时打印信息 |
-XX:-PrintGCDetails | 打印GC详细信息 |
-XX:-PrintGCTimeStamps | 打印GC用时 |
-XX:-PrintTenuringDistribution | 打印Tenuring年龄信息 |
-XX:-PrintAdaptiveSizePolicy | 打印自适应调整 |
-XX:-TraceClassLoading | 跟踪类加载 |
-XX:-TraceClassLoadingPreorder | 跟踪所有加载的引用类 |
-XX:-TraceClassResolution | 跟踪常量池的变化 |
-XX:-TraceClassUnloading | 跟踪类的卸载 |
-XX:-TraceLoaderConstraints | 打印class的装载策略变化信息到stdout。 |
-XX:+PerfDataSaveToFile | 退出时保存jvmstat二进制文件 |
-XX:ParallelGCThreads=n | 设置新生代与老年代并行垃圾回收器的线程数 |
-XX:+UseCompressedOops | 使用compressed pointers。这个参数默认在64bit的环境下默认启动,但是如果JVM的内存达到32G后,这个参数就会默认为不启动,因为32G内存后,压缩就没有多大必要了,要管理那么大的内存指针也需要很大的宽度了 |
-XX:+AlwaysPreTouch | 在JVM 初始化时预先对Java堆进行摸底 |
-XX:AllocatePrefetchDistance=n | 为对象分配设置预取距离 |
-XX:InlineSmallCode=n | 当编译的代码小于指定的值时,内联编译的代码 |
-XX:MaxInlineSize=35 | 内联方法的最大字节数 |
-XX:FreqInlineSize=n | 内联频繁执行的方法的最大字节码大小 |
-XX:LoopUnrollLimit=n | 代表节点数目小于给定值时打开循环体 |
-XX:InitialTenuringThreshold=7 | 设置初始的对象在新生代中最大存活次数 |
-XX:MaxTenuringThreshold=n | 设置对象在新生代中最大的存活次数,最大值15,并行回收机制默认为15,CMS默认为4 |
-Xloggc:<filename> | 输出GC详细日志信息至指定文件 |
-XX:-UseGCLogFileRotation | 开启GC日志文件切分功能,前置选项 -Xloggc |
-XX:NumberOfGClogFiles=1 | 设置切分GC日志文件数量,文件命名格式:.0, .1, ..., .n-1 |
-XX:GCLogFileSize=8K | GC日志文件切分大小 |