一、JVM 参数
参数 | 描述 | 示例 |
---|
-version / -showversion | 两参数功能基本一样,输出 Java 版本号、JRE 版本号、JVM名称、类型、版本 | |
-Xint / -Xcomp / -Xmixed | 指定 JVM 以解释模式、编译模式、混合模式运行 | |
-XX:+PrintCommandLineFlags | 让 JVM 打印出用户设置的和 JVM 设置的详细的XX参数的名称和值 | |
二、JVM 日志参数
参数 | 描述 | 示例 |
---|
-XX:+PrintGC | 开启简单GC日志模式,为每一次新生代(young generation)的GC和每一次的Full GC打印一行信息 | |
-XX:PrintGCDetails | 开启详细GC日志模式。在这种模式下,日志格式和所使用的GC算法有关 | |
-XX:+PrintGCTimeStamps | 可以将时间也加到GC日志中 | |
-XX:+PrintGCDateStamps | 可以将绝对的日期和时间加到GC日志中。推荐同时使用-XX:+PrintGCTimeStamps 和 -XX:+PrintGCDateStamps 这两个参数 | |
-Xloggc | 缺省的GC日志时输出到终端的,使用-Xloggc:也可以输出到指定的文件。需要注意这个参数隐式的设置了参数-XX:+PrintGC和-XX:+PrintGCTimeStamps,但为了以防在新版本的JVM中有任何变化,我仍建议显示的设置这些参数 | |
三、JVM 内存调优参数
参数 | 描述 | 示例 |
---|
-server / -client | 以服务端 / 客户端运行 JVM | |
-Xms / -XX:InitialHeapSize | 指定 JVM 的初始堆内存大小,单位不区分大小写:k,m,g | -Xms10m |
-Xmx / -XX:MaxHeapSize | 指定 JVM 的最大堆内存大小,单位不区分大小写:k,m,g | -Xmx2g |
-XX:+HeapDumpOnOutOfMemoryError | JVM 在发生内存溢出时自动的生成堆内存快照,一般配合 -XX:HeapDumpPath 使用 | |
-XX:HeapDumpPath | 改变默认的堆内存快照生成路径,指定 JVM 堆内存快照生成路径(绝对路径或相对路径) | -XX:HeapDumpPath=/usr/local/heap |
-XX:NewRatio | 当 JVM 内存溢发生时可以执行一些指令,比如发个E-mail或者执行一些清理工作 | -XX:OnOutOfMemoryError ="sh ~/restart.sh" |
-XX:PermSize | 设置永久代初始大小,注意:设置的永久代大小并不会被包括在使用参数-XX:MaxHeapSize 设置的堆内存大小中 | -XX:PermSize=128m |
-XX:MaxPermSize | 设置永久代大小的最大值,注意:设置的永久代大小并不会被包括在使用参数-XX:MaxHeapSize 设置的堆内存大小中 | -XX:MaxPermSize=256m |
-XX:InitialCodeCacheSize | | |
-XX:ReservedCodeCacheSize | | |
-XX:+UseCodeCacheFlushing | | |
-XX:NewSize | 指定 JVM 新生代初始大小 | -XX:NewSize=32m |
-XX:MaxNewSize | 指定 JVM 新生代最大大小。设置 XX:MaxNewSize 参数时,应该考虑到新生代只是整个堆的一部分,新生代设置的越大,老年代区域就会减少。一般不允许新生代比老年代还大,因为要考虑GC时最坏情况,所有对象都晋升到老年代 | -XX:MaxNewSize=512m |
-XX:NewRatio | 设置老年代与新生代的比例。如果针对新生代,同时定义绝对值和相对值,绝对值将起作用。java -XX:NewSize=32m -XX:MaxNewSize=512m -XX:NewRatio=3 MyApp JVM 会尝试为新生代分配四分之一的堆大小,但不会小于32MB或大于521MB | -XX:NewRatio=3 表示老年代/新生代为3/1。老年代占堆大小的 3/4 ,新生代占 1/4 |
-XX:SurvivorRatio | 指定 Eden 与幸存区大小比例 | -XX:SurvivorRatio=10 表示 Eden 是幸存区 To 大小的10倍(也是幸存区From的10倍)。所以 Eden 占新生代大小的10/12, 幸存区From和幸存区To 每个占新生代的1/12 。注意两个幸存区永远是一样大的 |
-XX:+PrintTenuringDistribution | 指定 JVM 在每次新生代GC时,输出幸存区中对象的年龄分布 | |
-XX:InitialTenuringThreshold | 设定老年代阀值的初始值 | |
-XX:MaxTenuringThreshold | 设定老年代阀值的最大值 | |
-XX:TargetSurvivorRatio | 设定幸存区的目标使用率 | |
-XX:+NeverTenure | 设置对象永远不会晋升到老年代 | |
-XX:+AlwaysTenure | 表示没有幸存区,所有对象在第一次GC时,会晋升到老年代 | |
四、JVM 吞吐量收集器参数
参数 | 描述 | 示例 |
---|
-XX:+UseSerialGC | 指定 JVM 使用串行垃圾收集器 | |
-XX:+UseParallelGC | 指定 JVM 年轻代使用并行垃圾收集 | |
-XX:+UseParallelOldGC | 指定 JVM 年轻代使用并行垃圾收集,年老代也使用并行垃圾收集 | |
-XX:ParallelGCThreads | 指定并行垃圾收集的线程数量。如果不明确设置该标志,虚拟机将使用基于可用(虚拟)处理器数量计算的默认值。 决定因素是由Java Runtime。availableProcessors()方法的返回值N,如果N<=8,并行垃圾收集器将使用N个垃圾收集线程,如果N>8个可用处理器,垃圾收集线程数量应为3+5N/8 | -XX:ParallelGCThreads=6 表示每次并行垃圾收集将有6个线程执行 |
-XX:-UseAdaptiveSizePolicy | 停用 JVM 自适应行为,默认 JVM 是激活自适应行为的 | |
-XX:GCTimeRatio | 指定目标应用程序线程的执行时间(与总的程序执行时间)达到N/(N+1)的目标比值,默认值是99 | 通过 -XX:GCTimeRatio=9 我们要求应用程序线程在整个执行时间中至少9/10是活动的(因此,GC线程占用其余1/10) |
-XX:MaxGCPauseMillis | 设置 JVM 最大暂停时间的目标值(以毫秒为单位) | -XX:MaxGCPauseMillis=20 |
五、JVM CMS 收集器参数
并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间。适用于大多数交互式应用,比如 web 应用。
参数 | 描述 | 示例 |
---|
-XX:+UseConcMarkSweepGC | 激活 CMS 收集器。默认HotSpot JVM使用的是并行收集器 | |
-XX:UseParNewGC | 激活年轻代使用多线程并行执行垃圾回收。对于CMS收集器,年轻代GC算法和老年代GC算法是不同的,因此年轻代GC有两种不同的实现,并且是两个不同的标志。注意最新的JVM版本,当使用-XX:+UseConcMarkSweepGC时,-XX:UseParNewGC会自动开启。因此,如果年轻代的并行GC不想开启,可以通过设置-XX:-UseParNewGC来关掉。 | |
-XX:+CMSConcurrentMTEnabled | 并发的CMS阶段将以多线程执行(因此多个GC线程会与所有的应用程序线程并行工作)。该标志已经默认开启,如果顺序执行更好,这取决于所使用的硬件,多线程执行可以通过-XX:-CMSConcurremntMTEnabled 禁用 | |
-XX:ConcGCThreads | 定义并发CMS过程运行时的线程数。如果还标志未设置,JVM会根据并行收集器中的 -XX:ParallelGCThreads 参数的值来计算出默认的并行CMS线程数。该公式是ConcGCThreads = (ParallelGCThreads + 3)/4 | -XX:ConcGCThreads=4 意味着CMS周期的所有阶段都以4个线程来执行 |
-XX:CMSInitiatingOccupancyFraction | 当堆满之后,并行收集器便开始进行垃圾收集。 | -XX:CMSInitiatingOccupancyFraction=<value> 该值代表老年代堆空间的使用率。比如,value=75 意味着第一次CMS垃圾收集会在老年代被占用75%时被触发。通常 CMSInitiatingOccupancyFraction 的默认值为 68 |
-XX:+UseCMSInitiatingOccupancyOnly | 设置 JVM 不基于运行时收集的数据来启动 CMS 垃圾收集周期。而是,当该标志被开启时,JVM通过CMSInitiatingOccupancyFraction的值进行每一次CMS收集。 | |
-XX:+CMSClassUnloadingEnabled | 设置 JVM 对永久代进行垃圾回收 | |
-XX:+CMSIncrementalMode | 将开启 CMS 收集器的增量模式。增量模式经常暂停 CMS 过程,以便对应用程序线程作出完全的让步。因此,收集器将花更长的时间完成整个收集周期。因此,只有通过测试后发现正常 CMS 周期对应用程序线程干扰太大时,才应该使用增量模式。这种情况发生得很少 | |
-XX:+ExplicitGCInvokesConcurrent | 设置 JVM 无论什么时候调用系统GC,都执行 CMS GC,而不是 Full GC | |
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses | 保证当有系统GC调用时,永久代也被包括进 CMS 垃圾回收的范围内 | |
-XX:+DisableExplicitGC | 设置 JVM 完全忽略系统的GC调用 | |