JVM-调优参数-JDK1.8

说明

  • ==注意:在’-XX:’和具体参数之间是没有空格的,本文中出现了部分空格是因为MD(Markdown)语法原因,MD语法中冒号加大写P是:P(表情),所以冒号和大写 P之间要有空格才能表示正确意思,在使用中请避免空格;==
  • ==本文提供一些常规的命令行参数和一些环境变量,这些参数都会影响Java HotSpot虚拟机的性能,除了特殊说明,本文的这些参数都可以应用在Java HotSpot Client VM和Java HotSpot Server VM;==
  • ==由于本篇着重于JVM性能调优相关参数,为此省略了部分参数;==
  • ==本文摘自【Java HotSpot VM Options—Windows】并转译,本文并不是完整的转译,部分地方有删减;==
  • ==本人水平有限,如有不正确的地方烦请指出,感激不尽。==

标准参数

来自于java命令的帮助信息。

选项和默认值 描述
-d32 使用 32 位数据模型 (如果可用)
-d64 使用 64 位数据模型 (如果可用)
-server 选择 “server” VM,默认 VM 是 server.
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>,用 ‘;’ 分隔的目录, JAR 档案和 ZIP档案列表, 用于搜索类文件。
-D<名称>=<值> 设置系统属性
-verbose:[class/gc/jni] 启用详细输出
-version 输出产品版本并退出
-showversion 输出产品版本并继续
-?/-help 输出此帮助消息
-X 输出非标准选项的帮助
-esa 或 -enablesystemassertions 启用系统断言
-dsa 或 -disablesystemassertions 禁用系统断言
-agentlib:[=<选项>] 加载本机代理库 , 例如-agentlib:hprof,另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:[=<选项>] 按完整路径名加载本机代理库
-javaagent:[=<选项>] 加载 Java 编程语言代理,请参阅java.lang.instrument
-splash: 使用指定的图像显示启动屏幕

非标准参数

来自于’java -X’的帮助信息。

选项和默认值 描述
-Xmixed 混合模式执行 (默认)
-Xint 仅解释模式执行
-Xbootclasspath: <用 ; 分隔的目录和 zip/jar 文件>,设置搜索路径以引导类和资源
-Xbootclasspath/a: <用 ; 分隔的目录和 zip/jar 文件>,附加在引导类路径末尾
-Xbootclasspath/p: <用 ; 分隔的目录和 zip/jar 文件>,置于引导类路径之前
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xloggc: 将 GC 状态记录在文件中 (带时间戳)
-Xbatch 禁用后台编译
-Xmn 设置新生代的初始值和最大值,单位默认是字节,可以使用k,m,g
-Xms 设置初始 Java 堆大小,单位默认是字节,可以使用k,m,g
-Xmx 设置最大 Java 堆大小,单位默认是字节,可以使用k,m,g
-Xss 设置 Java 线程堆栈大小,单位默认是字节,可以使用k,m,g
-Xprof 输出 cpu 配置文件数据
-Xfuture 启用最严格的检查, 预期将来的默认值
-Xrs 减少 Java/VM 对操作系统信号的使用 (请参阅相关文档)
-Xcheck:jni 对 JNI 函数执行其他检查
-Xshare: off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据 (默认)
-Xshare: on 要求使用共享类数据, 否则将失败。
-XshowSettings 显示所有设置并继续
-XshowSettings:all 显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties 显示所有属性设置并继续
-XshowSettings:locale 显示所有与区域设置相关的设置并继续

高级的运行选项

  • ‘-XX:+CheckEndorsedAndExtDirs’,如果使用交房标准(endorsed-standards)的重写机制或拓展机制,那么打开这个选项就会禁止Java程序运行java命令,这个选项会检查程序有没有使用以下机制之一:
    • 设置java.ext.dirs 或者java.endorsed.dirs 属性;
    • lib/endorsed目录存在并且不为空;
    • lib/ext 目录下包含有JDK中没有jar文件;
    • system-wide,platform-specific 拓展目录包含有jar文件
  • ‘-XX:+DisableAttachMechanism’,打开这个选项就会关闭JVM提供给外部工具访问的接口,默认情况下,这个选项是关闭的,这就意味着可以使用jcmd、jstack、jinfo等工具连接jvm
  • ‘-XX:+FailOverToOldVerifier’,打开这个选项,当新类型检测器失败的时候会自动转移到旧的类型检测器,默认情况下,这个选项是关闭的,并且它会忽略类的字节码版本,当然你也可以打开它来检测类的旧字节码版本。
  • ‘-XX:+FlightRecorder’,打开这个选项表示在程序的运行区间使用Java运行记录器(Java Flight Recorder,JFR),这是一个双赢特色,它可以和’-XX:+UnlockCommercialFeatures’来协同使用:’java -XX:+UnlockCommercialFeatures -XX:FlightRecorder’,如果没有提供这个选项,那么Java运行记录器在JVM运行时就默认打开,提供给jcmd作为特殊指令使用。
  • ‘-XX:FlightRecorderOptions=parameter=value’,这个选项用来设置参数来控制JFR的行为,(可以使用逗号来分隔多个参数一起使用)这个选项只有在JFR打开的情况下才能使用:以下是JFR的一些参数:
    • defaultrecording={true|false},设置记录器一直在后台运行或只运行一段时间,默认情况下这个参数是false(只允许运行一段时间)
    • disk={true|false},这个参数控制记录器是否持续记录到硬盘中,默认情况下,这个参数是false(没有持续记录到硬盘中),如果需要打开,defaultrecording=true也是要打开
    • dumponexit={true|false},当JVM终端在控制模式下,JFR的数据是否要导出文件,默认情况下,这个参数是false,如果要打开,则defaultrecording=true也是要打开,导出文件的路径通过参数dumponexitpath设置
    • dumponexitpath=path,跟dumponexit参数一起使用,这里是设置导出文件的文件名和目录,如果对应的文件已经存在,JVM会生成以时间和时间戳为文件名的文件。
    • globalbuffersize=size,设置数据保存的内存总量,可以使用度量单位,如k/K代表KB,m/M代表MB,g/G代表GB,默认值是462848字节
    • loglevel={quiet|error|waring|info|debug|trace},JFR的日志等级,默认值是info
    • maxage=time,默认记录器保存到硬盘中的数据的最大年龄(时间),可以用s/m/h/d来代替秒/分/时/天,默认值是15分,这个参数只有在disk=true时才有效。
    • maxchunksize=size,记录器中的数据块的最大值,可以使用k/K代表KB,m/M代表MB,g/G代表GB,默认值是12MB
    • maxsize=size,默认的记录器保存到硬盘的数据最大值,可以使用k/K代表KB,m/M代表MB,g/G代表GB,默认值是0,表示无限制
    • repository=path,设置硬盘中临时存储目录,默认值是系统的temporary
    • samplethreads={true|false},是否打开线程抽样,默认值是打开
    • settings=path,设置事件的配置文件,默认值是%JAVA_HOME%/jre/lib/jfr/default.jfc
    • stackdepth=depth,JFR追踪栈的栈深度,默认情况下,支持64个方法调用,最小值是1,最大值是2048
    • threadbuffersize=size,设置每个线程的私有缓存大小,可以使用k/K代表KB,m/M代表MB,g/G代表GB,如果把这个参数设置大值,在没有争用的情况下,允许获取更多数据,以将其刷新到全局存储中,在线程多的环境中,它可以提高应用的空间使用率,默认值是5KB。
  • ‘-XX:MaxDirectMemorySize’,设置NIO的缓冲区最大值,可以使用k/K代表KB,m/M代表MB,g/G代表GB,默认值是0,表示JVM自动分配缓冲区大小。
  • ‘-XX:NativeMemoryTracking=mode’,JVM本地内存的使用模式,off:关闭;summary:只追踪JVM的子系统,如Java堆,类,字节码和线程;detail:额外追踪JVM子系统的内存使用率,跟踪内存使用的调用点,私有虚拟内存区域和其托付的区域。
  • ‘-XX: ObjectAlignmentInBytes=aligment’,设置java对象的内存准线,默认值是8字节,这个值最好是2的倍数,必须是8到256之间,这个选项可能会让大java堆容量使用压缩指针。
  • ‘-XX: OnOutOfMemoryError=string’,当第一次发生内存溢出的时候,就会运行这个参数设置的自定义的命令或以分号分隔的命令,如果命令包含有空格,则必须用引号括起来。
  • ‘-XX:+PrintNMTStatistics’,当本地内存追踪打开(-XX:NativeMemoryTracking)的时候,这个选项打开就会在jvm退出的时候打印本地内存追踪栈信息,默认情况下这个选项是关闭的。
  • ‘-XX:+RelaxAccessControlCheck’,减少验证器中访问控制检查的数量,默认情况下这个选项是关闭的,它会忽略类的最近字节码版本。
  • ‘-XX:+ResourceManagement’,打开这个选项表示在程序运行时可以使用资源管理,这个选项需要搭配’-XX:+UnlockCommercialFeatures’一起使用,如:’java -XX:+UnlockCommercialFeatures -XX:+ResourceManagement’。
  • ‘-XX:ResourceManagementSampleInterval=value’,这个参数是控制资源管理采样间隔,单位是毫秒,这个选项只有在’-XX:+ResourceManagement’选项打开的时候才有用。
  • ‘-XX:SharedArchiveFile=path’,设置类数据共享文件的目录和文件名。
  • ‘-XX:SharedClassListFile=file_name’,设置类数据文件的完整文件名,使用斜线(/)代替点(.),比如要保存java.lang.Object和hello.Main,生成的文件包含有以下内容:
java/lang/Object
hello/Main

程序中要用到的类的信息一般都会包含在这个文件中,它们包含程序中的类信息,拓展或启动类的路径信息。
- ‘-XX:+ShowMessageBoxOnError’,打开这个选项时,当JVM产生异常的时候会弹出对话提示框显示异常信息,这个选项可以防止JVM产生错误的时候马上退出,因此你可以连接jvm进行调试,默认情况下这个选项是关闭的。
- ‘-XX:+UseMembar’,打开这个选项表示使线程状态转换成membars发行(Enables issuing of membars on thread state transitions),默认情况下,除了ARM中server模式下是打开的,其他平台都是关闭。
- ‘-XX:+UsePerfData’,打开perfdata特色,这个选项默认情况下是打开的,允许JVM监测和性能测试。
- ‘-XX:+AllowUserSignalHandlers’,允许程序安装信号处理器,默认情况下是关闭。

高级JIT编译器选项

  • ‘-XX:AllocateInstancePrefetchLines=lines’,在实例分配指针之前设置要预取的行数。
  • ‘-XX:CICompilerCount=threads’,设置编译线程数,默认情况下,JVM server模式下是2,JVM client模式下是1。
  • ‘-XX:CodeCacheMinimumFreeSpace=size’,设置编译时最小空闲空间,当空闲空间小于这个最小值时,编译会停止。
  • ‘-XX:+DoEscapeAnalysis’,逃逸分析,这个选项默认是打开。
  • ‘-XX:InitialCodeCacheSize=size’,设置代码缓存区初始化大小,默认是500KB,这个初始值不可以小于系统的最小内存页大小。
  • ‘-XX:+Inline’,打开内联函数,这个选项默认打开用来提升性能。
  • ‘-XX:+PrintAssembly’,打印汇编代码,打开这个选项可以查看生成的代码,可以帮助提升性能。
  • ‘-XX:+PrintInlining’,打印内联信息,可以查看哪个方法被内联。

高级功能选项

  • ‘-XX:+HeapDumpOnOutOfMemory’,当产生内存溢出的时候会导出java堆信息到当前目录中,可以通过’-XX:HeapDumpPath=path’来设置输出目录。
  • ‘-XX:LogFile=path’,设置日志输出路径和文件名,默认是当前工作目录,文件名是hotspot.log。
  • ‘-XX:+UnlockDiagnosticVMOptions’,不要锁定调试JVM的选项,默认情况下,这个选项是关闭的,并且调试选项也是无效。

高级垃圾回收选项

以下选项,控制的是Java HotSpot虚拟机的垃圾回收机制
- ‘-XX:+AggressiveHeap’,开启java堆优化,这个选项设置之后,长时间运行的变量参数都会得到优化,默认情况下,这个选项是关闭的。
- ‘-XX:+AlwaysPreTouch’,在JVM初始化的时候,开启接触Java堆上的每页内存,在进入main方法之前,这个选项可以把所有页放入内存中,这个选项可以用在模拟长时间运行的系统中,该系统中会把所有虚拟内存映射到物理内存中,默认情况下,这个选项是关闭的,所有页都会提交并把JVM堆空间塞满。
- ‘-XX:+CMSClassUnloadingEnabled’,在使用并行标记清理(CMS)垃圾回收器的时候不加载类,默认情况下是打开状态。
- ‘-XX:CMSExpAvgFactor=percent’,当进行并行回收统计的指数平均数计算时,当前样例的时间百分比(0到100),默认值是25(25%)。
- ‘-XX:CMSInitiatingOccupancyFraction=percent’,当使用CMS回收器收集时,设置老年代的占用率(0-100),默认值是-1,任何消极值(Any negative value)都隐性指向’-XX:CMSTriggerRatio’来设置(老年代)启动占用率。
- ‘-XX:+CMSScavengeBeforeRemark’,这个选项表示,在CMS重新标记之前再尝试清理,默认是关闭。
- ‘-XX:CMSTriggerRatio=percent’,在CMS回收器开始回收之前根据’-XX:MinHeapFreeRatio’来设置可分配值的百分比(0-100),默认值是80(80%)。
- ‘-XX:ExplicitGCInvokesConcurrent’,在System.gc()发起请求的时候执行并行GC,这个选项默认关闭,并且跟’-XX:+UseConcMarkSweepGC’一起使用才有效。
- ‘-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses’,在System.gc()发起请求时执行并行GC,并且在执行期间不加载类,这个选项默认是关闭,并且只有跟’-XX:+UseConcMarkSweepGC’一起使用才有效。
- ‘-XX:G1PrintHeapRegions’,使用G1回收器的时候打印分配区域的信息,默认是关闭。
- ‘-XX:InitialHeapSize=size’,设置内存分配池的初始化大小,这个值必须是0或1024的倍数并且还需要大于1MB,默认值是系统在运行时自动选择。如果设为0,那么初始值就是新生代和老年代的总和,新生代的大小可以用’-XX:NewSize’来设置。
- ‘-XX:InitialSurvivorRatio=ratio’,设置幸存区的初始空间比例,当使用’-XX:+UseParallelGC’和’-XX:+UseParallelOldGC’选项的默认值时,幸存区的空间会自适应改变,并且幸存区的大小会根据程序的行为来改变,不管哪种改变,都是从初始值开始。如果自适应大小关闭(使用’-XX:-UseAdaptiveSizePolicy选项’),当程序要运行的时候就会使用‘-XX:SurvivorRatio’选项来设置幸存区的大小。下面有公式来计算幸存区大小,假设幸存区大小是S,年轻代的大小是Y,幸存区的初始空间比例是R,那么则有:

S=Y/(R+2)

公式中的2表示有两个幸存区(s0和s1)空间,大值就是幸存区的初始化空间比例,小值则是幸存区初始空间大小。默认情况下,幸存区的空间比例是8,如果年轻代的默认空间大小是2MB,那么幸存区的初始空间大小则是0.2MB,
- ‘-XX:MaxHeapSize=size’,内存分配池的最大值,这个值必须是1024的倍数并且需要大于2MB,默认值是在运行时系统自动配置,在server发布版中,’-XX:InitialHeapSize’和’-XX:MaxHeapSize’设置的是同一个值
- ‘-XX:MaxMetaspaceSize=size’,设置可被分配给类元数据的本地内存的最大值,默认情况下,这个大小是没有限制,程序的类元数据大小依赖于程序本身、其他运行中的程序、系统有效的内存。
- ‘-XX:MetaspaceSize=size’,设置类元数据的内存空间初始值,具体值可大可小,具体还是依赖元数据的使用率,默认值跟平台有关。
- ‘-XX:+ParallelRefProcEnabled’,打开并行引用处理,默认是关闭。
- ‘-XX:+PrintGCApplicationConcurrentTime’,打印最后一次暂停到现在的时间,默认关闭。
- ‘-XX:+PrintGCApplicationStoppedTime’,最后一次暂停所消耗的时间,默认关闭。
- ‘-XX:+PrintGCDateStamps’,打印每次GC的时间戳,默认关闭。
- ‘-XX:+PrintGCTaskTimeStamps’,打印每个GC工作线程的时间戳,默认关闭。
- ‘-XX:+PrintStringDeduplicationStatistics’,打印详细的重复数据统计,默认关闭。
- ‘-XX:+ScavengeBeforeFullGC’,在每次进行full GC之前先在年轻代进行GC,默认打开,Oracle推荐不要关闭,因为在full GC之前清除年轻代可以减少因老年代空间膨胀而压缩年轻代空间。
- ‘-XX:SoftRefLRUPolicyMSPerMB=time’,设置堆里面的软引用对象的存活时间,单位为毫秒,默认值是堆释放每兆字节的时间,这个选项可以接受整数值来表示在当前堆释放每兆字节的时间(Java HotSpot Client VM),或者是最大可能的堆大小(Java HotSpot Server VM),这个区别意味着Client VM 刷新软引用相当于增大堆大小,而Server VM要增大堆大小相当于进行刷新软引用;后一种情况下,’-Xmx’的值则会明显影响软引用会多快被回收。
- ‘-XX:StringDeduplicationAgeThreshold=threshold’,String对象到了指定年龄都会被考虑回收,对象的年龄意味着它还能存活多长时间,有时候也被称为生命期限;注意,String对象在到达被回收的年龄之前都会被推进老年代区域,这个选项的默认值是3。
- ‘-XX:TLABSize=size’,设置线程私有缓冲区的初始化大小,可以使用度量单位k/K、m/M,g/G、,默认值是0,表示由JVM选择大小。
- ‘-XX:+UseAdaptiveSizePolicy’,打开自适应生成大小的使用,默认打开,如果关闭则可以使用’-XX:-UseAdaptiveSizePolicy’并且需要明确设置内存分配池的大小(-XX:SurvivorRatio)。
- ‘-XX:+UseCMSInitiatingOccupancyOnly’,打开使用CMS回收器初始化时占用率的唯一标准,默认关闭,使用其他标准。
- ‘-XX:+UseGCOverheadLimit’,在抛出内存溢出之前,JVM在GC上花的时间比例限制,这个选项默认打开,并且并行GC花费的时间超过98%而堆恢复时间少于2%时则会抛出内存溢出,当堆比较小时,这个功能可以防止没有多少计算或操作的程序长时间运行,关闭这个选项使用’-XX:-UseGCOverheadLimit’。
- ‘-XX:+UseNUMA’,打开这个选项后,程序在非均匀存储架构(nonuniform memory architecture[NUMA])中可以提升程序的低延迟内存的应用率,默认关闭并且没有在NUMA模式下进行优化,这个选项只有在并行垃圾回收时(使用-XX:+UseParallelGC)才有效。
- ‘-XX:+UseParNewGC’,打开这个选项后,年轻代就使用并行线程回收器,默认关闭,当使用’-XX:+UseConcMarkSweepGC’时默认打开。
- ‘-XX:+UseStringDeduplication’,打开字符串重复删除,默认关闭,要使用这个选项,必须使用垃圾优先回收器(G1)。
- ‘-XX:+UseTLAB’,打开这个选项后,在年轻代使用线程私有分配块(thread-local allocation blocks),默认打开。

jdk1.8中废弃并删除的选项

  • ‘-Xincgc’
  • ‘-Xrunlibname’
  • ‘-XX:CMSIncrementalDutyCycle=percent’
  • ‘-XX:CMSIncrementalDutyCycleMin=percent’
  • ‘-XX:+CMSIncrementalMode’
  • ‘-XX:CMSIncrementalOffset=percent’
  • ‘-XX:+CMSIncrementalPacing’
  • ‘-XX:CMSIncrementalSafetyFactor=percent’
  • ‘-XX:CMSInitiatingPermOccupancyFraction=percent’
  • ‘-XX:MaxPermSize=size’
  • ‘-XX: PermSize=size’
  • ‘-XX:+UseSplitVerifier’
  • ‘-XX:+UseStringCache’
展开阅读全文

没有更多推荐了,返回首页