所有分类
  • 所有分类
  • 未分类

JVM调优-Java命令选项(参数)-大全/详解

简介

说明

本文介绍Java的java命令用法,包括:常用用法、选项大全。

Java选项

Java是通过java虚拟机来装载和执行编译文件(class文件)的,java虚拟机通过命令java -option 来启动,-option为虚拟机参数,通过这些参数可对虚拟机的运行状态进行调整。

官网

官网文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

格式

java [-options] classname [args…]          (执行类)
java [-options] -jar filename [args…]       (执行 jar 文件)
java -XX:+PrintFlagsFinal -version       (查看默认配置)

  • options 是可选项,选项之间使用空格分割
  • classname 是要加载的类的名字
  • filename 是要执行的 java 压缩文件(JAR)的名字,需要和 -jar 搭配使用
  • args 是传递给 main() 方法的参数,使用空格分割

该选项的书写形式分为两大类:

  1. Boolean类型
    1. 格式:-XX:[+-]<name> 表示启用或者禁用name属性。
    2. 例子:-XX:+UseG1GC(表示启用G1垃圾收集器)
  2. Key-Value类型
    1. 格式:-XX:<name>=<value> 表示name的属性值为value。
    2. 例子:-XX:MaxGCPauseMillis=500(表示设置GC的最大停顿时间是500ms)

示例

java -X

选项

java的命令行选项分为三类:

  1. 标准选项(-)。jvm必须实现的选项,实现通用的功能,如检查运行环境,检查JRE的版本,设置类路径等。此类选项前缀为:-
  2. 扩展选项(-X)。HotSpot虚拟机实现常用功能的选项,其他jvm不一定实现。此类选项前缀为:-X
  3. 高级选项(-XX)。高级选项是开发者选项,不保证在所有的jvm上实现,并可能会改变。此类选项前缀为:-XX
    1. 高级选项分为如下四种类型:
      1. 高级运行时选项:控制jvm运行时的行为
      2. 高级维护性选项:支持收集系统信息和调试
      3. 高级GC选项:控制jvm的垃圾收集行为
      4. 高级JIT选项:控制jvm的及时编译行为

常用操作

作用命令说明
查看所有参数java -XX:+PrintFlagsFinal -version会输出所有配置,超级详细
查看已经设置过的参数java -XX:+PrintCommandLineFlags只会输出设置过的,默认的并不会输出。
内存溢出时打印到文件java -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
-XX:+HeapDumpOnOutOfMemoryError:JVM遇到OOM时能输出堆内信息 -XX:+HeapDumpPath:设置堆内存溢出快照输出的文件地址。
OOM后,执行一个脚本java -XX:OnOutOfMemoryError=”C:\Program Files\Java\jdk1.8.0_152\bin\jconsole.exe”发生OOM后,运行jconsole.exe程序。这里可以不用加“”,因为jconsole.exe路径Program Files含有空格。 利用这个参数,我们可以在系统OOM后,自定义一个脚本,可以用来发送邮件告警信息,可以用来重启系统等等。
FullGC之前打印java -XX:+HeapDumpBeforeFullGC
打印GC简单信息java -verbose:gc 或:java -XX:+PrintGC结果示例: ​


打印详细GC信息java -XX:+PrintGCDetails 或java -XX:+PrintGCTimeStamps结果示例: ​编辑
指定GC日志以文件输出java -Xloggc:./gc.log将gc日志以文件的形式输出,更方便我们去查看日志,定位问题。

java -XX:+PrintGC 结果示例

第一行,表示GC回收之前有12195K的内存,回收之后剩余1088K,总共内存为125951K 。

java -XX:+PrintGCDetails 结果示例

一、标准选项

标准选项含义
-d32使用 32 位数据模型 (如果可用)
-d64使用 64 位数据模型 (如果可用)
-server选择 “server” VM
-hotspot是 “server” VM 的同义词 [已过时]。默认 VM 是 server.
-cp <目录和 zip/jar 文件的类搜索路径> 或:-classpath <目录和 zip/jar 文件的类搜索路径>用 ; 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。
-D<name>=<value>设置系统属性
-verbose[:class|gc|jni]启用详细输出
-version输出产品版本并退出
-version:<value>需要指定的版本才能运行
-showversion输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search在版本搜索中包括/排除用户专用 JRE
-? -help输出此帮助消息
-X输出非标准选项的帮助
-ea[:<packagename>…|:<classname>] -enableassertions[:<packagename>…|:<classname>]按指定的粒度启用断言
-da[:<packagename>…|:<classname>] -disableassertions[:<packagename>…|:<classname>]禁用具有指定粒度的断言
-esa | -enablesystemassertions启用系统断言
-dsa | -disablesystemassertions禁用系统断言
-agentlib:<libname>[=<options>]加载本机代理库 <libname>, 例如 -agentlib:hprof
-agentpath:<pathname>[=<options>]按完整路径名加载本机代理库
-javaagent:<jarpath>[=<options>]加载 Java 代理。-javaagent 这个参数的个数是不限的,如果指定了多个,则会按指定的先后执行,执行完各个 agent 后,才会执行主程序的 main 方法。
-splash:<imagepath>使用指定的图像显示启动屏幕

1. -classpath,-cp

虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:

Bootstrap classes,Extension classes,User classes。

Bootstrap 中的路径是虚拟机自带的jar或zip文件,虚拟机首先搜索这些包文件,用System.getProperty(“sun.boot.class.path”)可得到虚拟机搜索的包名。

Extension是位于jre”lib”ext目录下的jar文件,虚拟机在搜索完Bootstrap后就搜索该目录下的jar文件。用System. getProperty(“java.ext.dirs”)可得到虚拟机使用Extension搜索路径。

User classes搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。

-cp 和 -classpath 是同义词,参数意义是一样的。classpath参数太长了,所以提供cp作为缩写形式,它们用于告知虚拟机搜索目录名、jar文档名、zip文档名,之间用分号;分隔。

例如当你自己开发了公共类并包装成一个common.jar包,在使用 common.jar中的类时,就需要用-classpath common.jar 告诉虚拟机从common.jar中查找该类,否则虚拟机就会抛出java.lang.NoClassDefFoundError异常,表明未找到类定义。

在运行时可用System.getProperty(“java.class.path”)得到虚拟机查找类的路径。

使用-classpath后虚拟机将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则虚拟机使用当前路径(.)作为类搜索路径。

推荐使用-classpath来定义虚拟机要搜索的类路径,而不要使用环境变量 CLASSPATH的搜索路径,以减少多个项目同时使用CLASSPATH时存在的潜在冲突。

例如应用1要使用a1.0.jar中的类G,应用2要使用 a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包,当a1.0.jar,a2.0.jar都在CLASSPATH中,虚拟机搜索到第一个包中的类G时就停止搜索,

如果应用1应用2的虚拟机都从CLASSPATH中搜索,就会有一个应用得不到正确版本的类G。

实例1:java -classpath lib\Launcher.jar com.teleca.robin.Launcher getProcessState.bat 5000
实例2:java -classpath classes com.teleca.robin.Launcher getProcessState.bat 5000

如果需要指定各个JAR文件具体的存放路径,相同路径有多个可使用通配符。

示例1:java -cp .;c:\classes\myClass.jar;d:\classes\*.jar packname.mainclassname
实例3:java -cp lib\*.jar com.teleca.robin.Launcher getProcessState.bat 5000
实例3-1:java -cp Util.jar;lib\sqljdbc.jar com.harry.j2se.AppEntrance

2.-D<propertyName>=value

在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机之上的应用程序可用System.getProperty(“propertyName”)得到value的值。

如果value中有空格,则需要用双引号将该值括起来,如-Dname=”space string”。

该参数通常用于设置系统级全局变量值,如配置文件路径,应为该属性在程序中任何地方都可访问。

示例1:设置虚拟机使用的Extension搜索路径:java -Djava.ext.dirs=lib MyClass  

3. -client,-server

这两个参数用于设置虚拟机使用何种运行模式,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。相反,server模式启动比client慢,但可获得更高的运行性能。

在windows上,缺省的虚拟机类型为client模式,如果要使用 server模式,就需要在启动虚拟机时加-server参数,以获得更高性能,对服务器端应用,推荐采用server模式,尤其是多个CPU的系统。在 Linux,Solaris上缺省采用server模式。

4. -hotspot

含义与client相同,jdk1.4以前使用的参数,jdk1.4开始不再使用,代之以client。

5. -verbose[:class|gc|jni]

在输出设备上显示虚拟机运行信息。

verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:
[Loaded java.io.FilePermission$1 from shared objects file]

当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。

6. -verbose:gc

在虚拟机发生内存回收时在输出设备显示信息,格式如下:

[Full GC 268K->168K(1984K), 0.0187390 secs]

该参数用来监视虚拟机内存回收的情况。

7.-verbose:jni

在虚拟机调用native方法时输出设备显示信息,格式如下:

[Dynamic-linking native method HelloNative.sum … JNI]

该参数用来监视虚拟机调用本地方法的情况,在发生jni错误时可为诊断提供便利。

9.-version

显示可运行的虚拟机版本信息然后退出。一台机器上装有不同版本的JDK时

10.-showversion

显示版本信息以及帮助信息。

11.-ea[:<packagename>…|:<classname>]-enableassertions[:<packagename>…|:<classname>]

从JDK1.4开始,java可支持断言机制,用于诊断运行时问题。通常在测试阶段使断言有效,在正式运行时不需要运行断言。断言后的表达式的值是一个逻辑值,为true时断言不运行,为false时断言运行,抛出java.lang.AssertionError错误。

上述参数就用来设置虚拟机是否启动断言机制,缺省时虚拟机关闭断言机制,用-ea 可打开断言机制,不加<packagename>和classname时运行所有包和类中的断言,如果希望只运行某些包或类中的断言,可将包名或类名加到-ea之后。例如要启动包com.foo.util中的断言,可用命令 ea:com.foo.util 。

:ea是enableassertions的缩写

12.-da[:<packagename>…|:<classname>]和-disableassertions[:<packagename>…|:<classname>]

用来设置虚拟机关闭断言处理,packagename和classname的使用方法和-ea相同。

:da应该是disableassertions的缩写

13.-esa -enablesystemassertions

设置虚拟机显示系统类的断言。

:esa是enablesystemassertions的缩写

14.-dsa -disablesystemassertions

设置虚拟机关闭系统类的断言。

:dsa是disablesystemassertions的缩写

15.-agentlib:<libname>[=<options>]

该参数是JDK5新引入的,用于虚拟机装载本地代理库。

Libname为本地代理库文件名,虚拟机的搜索路径为环境变量PATH中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。在Windows平台上虚拟机搜索本地库名为libname.dll的文件,在Unix上虚拟机搜索本地库名为libname.so的文件,搜索路径环境变量在不同系统上有所不同,Linux、SunOS、IRIX上为LD_LIBRARY_PATH,AIX上为LIBPATH,HP-UX上为SHLIB_PATH。

例如可使用-agentlib:hprof来获取虚拟机的运行情况,包括CPU、内存、线程等的运行数据,并可输出到指定文件中,可用-agentlib:hprof=help来得到使用帮助列表。在jre”bin目录下可发现hprof.dll文件。

17. -agentpath:<pathname>[=<options>]

设置虚拟机按全路径装载本地库,不再搜索PATH中的路径。其他功能和agentlib相同。

18.-javaagent:<jarpath>[=<options>]

虚拟机启动时装入java语言设备代理。Jarpath文件中的mainfest 文件必须有Agent-Class属性。代理类要实现public static void premain(String agentArgs, Instrumentation inst)方法。当虚拟机初始化时,将按代理类的说明顺序调用premain方法。

二、扩展选项

选项含义示例备注
-Xms<size>堆的最小值和初始值(默认以字节为单位) ms:memory start。 等效于 -XX:InitialHeapSize=size必须为1024的整数倍且大于1MB。 可用k(K)或m(M)或g(G)为单位来设置。 -Xms6400K,-Xms256M,-Xms2G    默认是物理内存的1/64,但最小是8MB。见:官网文档     默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。
-Xmx<size>堆的最大值(默认以字节为单位) mx:memory maximum。 等效于 -XX:MaxHeapSize=size Server端JVM最好将-Xms和-Xmx设为相同值,避免每次垃圾回收完成后JVM重新分配内存。必须为1024的整数倍且大于1MB。 可用k(K)或m(M)或g(G)为单位来设置。 -Xmx81920K,-Xmx80M,-Xmx2G    默认大小:256M。(若物理内存<= 192M,则值为1/2,若物理内存>=1G,则默认值为256M)。 见:官网文档      默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
-Xmn<size>年轻代的初始值与最大值(1.4 or lator)。 mn:memory new 等效于: 使用 -XX:NewSize 设置初始化大小并使用-XX:MaxNewSize 设置最大大小。可用k(K)或m(M)或g(G)为单位来设置。 -Xmn81920K,-Xmn80M,-Xmn2G    此处大小是(eden+ 2 survivor space),与jmap -heap中显示的New gen是不同的。
    整个堆大小=年轻代大小 + 老年代大小 + 持久代大小.
    增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-Xss<size>线程的栈的大小。 等效于:-XX:ThreadStackSize.可用k(K)或m(M)或g(G)为单位来设置。 Xss1m,Xss1024k,Xss1048576默认值: Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
-Xloggc:<file>将虚拟机每次垃圾回收的信息写到日志文件中,文件名由file指定,文件格式是平文件,内容和-verbose:gc输出内容相同。
-Xprof输出CPU运行时的诊断信息。
-Xmixed设置-client模式虚拟机对使用频率高的方式进行Just-In-Time编译和执行,对其他方法使用解释方式执行。该方式是虚拟机缺省模式。
-Xint设置-client模式下运行的虚拟机以解释方式执行类的字节码,不将字节码编译为本机码。
-Xbootclasspath:path -Xbootclasspath/a:path -Xbootclasspath/p:path改变虚拟机装载缺省系统运行包rt.jar而从-Xbootclasspath中设定的搜索路径中装载系统运行类。除非你自己能写一个运行时,否则不会用到该参数。
/a:将在缺省搜索路径后加上path 中的搜索路径。
/p:在缺省搜索路径前先搜索path中的搜索路径。
-Xnoclassgc关闭虚拟机对class的垃圾回收功能。
-Xincgc启动增量垃圾收集器,缺省是关闭的。增量垃圾收集器能减少偶然发生的长时间的垃圾回收造成的暂停时间。但增量垃圾收集器和应用程序并发执行,因此会占用部分CPU在应用程序上的功能。
-Xbatch虚拟机的缺省运行方式是在后台编译类代码,然后在前台执行代码,使用-Xbatch参数将关闭虚拟机后台编译,在前台编译完成后再执行。
-Xfuture对类文件进行严格格式检查,以保证类代码符合类代码规范。为保持向后兼容,虚拟机缺省不进行严格的格式检查。
-Xrs减少虚拟机中操作系统的信号(singals)的使用。该参数通常用在虚拟机以后台服务方式运行时使用(如Servlet)。
-Xcheck:jni调用JNI函数时进行附加的检查,特别地虚拟机将校验传递给JNI函数参数的合法性,在本地代码中遇到非法数据时,虚拟机将报一个致命错误而终止。使用该参数后将造成性能下降

三、高级选项

-XX:+HeapDumpOnOutOfMemoryError

开启堆转储功能。当Java应用抛出OutOfMemoryError异常时可以使用堆转储工具(HPROF)将Java堆存储到文件中。

默认文件存储在当前路径下,文件名为java_pid[pid].hprof。此外,还可使用选项-XX:HeapDumpPath=path指定文件地址。一个示例如下(其中%p表示进程PID):-XX:HeapDumpPath=/data/log/java_pid%p.hprof

-XX:LogFile=path

设置日志文件的地址。默认情况下,文件被写到当前目录下,文件名为hotspot.log。

一个示例:-XX:LogFile=/data/log/hotspot.log

-XX:OnOutOfMemoryError=string

设置发生OutOfMemoryError后执行的处理命令,多个命令可使用分号;分隔。如果命令中含有空格,需要使用双引号”包裹命令。

垃圾回收器

并行GC

JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。

选项含义默认值备注
-XX:+UseParallelGC设置年轻代为并行收集。 Parallel Scavenge + Serial Old-server时默认启用。年轻代使用并发收集,而年老代仍旧使用串行收集
-XX:+UseParNewGC设置年轻代为并行收集。 ParNew+Serial Old在JDK1.8被废弃,在JDK1.7还可以使用。 可与CMS同时使用。
-XX:+UseParallelOldGC设置新老年代都为并行收集。 Parallel Scavenge + Parallel Old默认不启用追求吞吐量的的最佳配合。 JAVA 6出现的参数选项。
-XX:ParallelGCThreads并行收集器的线程数。此值最好配置与处理器数目相等。同样适用于CMS。
-XX:MaxGCPauseMillis每次年轻代垃圾回收的最长时间(最大暂停时间)如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值.
-XX:+UseAdaptiveSizePolicy自动选择年轻代区大小和相应的Survivor区比例。        设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。         只需要设置基本的数据内存,如-Xms等。
-XX:GCTimeRatio设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
-XX:+ScavengeBeforeFullGCFull GC前调用YGCtrueDo young generation GC prior to a full GC. (Introduced in 1.4.1.)

CMS

选项含义默认值说明
-XX:+UseConcMarkSweepGC使用CMS内存收集。ParNew + CMS + Serial Old默认不启用。        低停顿,减少FGC的暂停时间。(配置这个后,-XX:NewRatio=4失效了,原因不明,此时年轻代大小最好用-Xmn设置)         CMS运行期间预留的内存无法满足程序需要,就会出现一次Concurrent Mode Failure失败,这时虚拟机将启动后备预案。临时启用Serial Old收集器来重新进行老年代的垃圾收集。
-XX:CMSInitiatingOccupancyFraction=70设置CMS收集器在老年代空间被使用多少后触发垃圾收集。92为了保证不出现promotion failed(见下面介绍)错误,该值的设置需要满足以下公式CMSInitiatingOccupancyFraction计算公式
-XX:+UseCMSCompactAtFullCollection在FULL GC的时候,对内存碎片合并整理。CMS收集器默认开启CMS是不会移动内存的, 因此, 这个非常容易产生碎片,导致内存不够用, 因此,内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片。
-XX:CMSFullGCsBeforeCompaction设置CMS收集器执行多少次不压缩的FullGC后,进行一次带压缩的。0默认值为0,表示每次进入Full GC时都进行碎片整理。
-XX:+AggressiveHeap使得 Xms没有意义。不启用此参数指明服务器进入最佳状态来运行占用大量内存且长时间运行的应用。 此参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-XX:+CMSParallelRemarkEnabled降低标记停顿
-XX:+UseCMSInitiatingOccupancyOnly使用手动定义初始化定义开始CMS收集禁止hostspot自行触发CMS GC
-XX:CMSInitiatingPermOccupancyFraction=70设置Perm Gen使用到达多少比率时触发92
-XX:+CMSIncrementalMode设置为增量模式用于单CPU情况
-XX:+CMSClassUnloadingEnabled

其他收集器

选项含义默认值说明
-XX:-UseSerialGC使用串行垃圾收集器。Serial+Serial Old-client时启用,其他情况默认不启用

功能开关

选项默认值或限制说明
-XX:-AllowUserSignalHandlers限于Linux和Solaris,默认不启用允许为java进程安装信号处理器,信号处理参见类:sun.misc.Signal, sun.misc.SignalHandler
-XX:+DisableExplicitGC默认启用禁止在运行期显式地调用System.gc()
-XX:+FailOverToOldVerifierJava6新引入选项,默认启用如果新的Class校验器检查失败,则使用老的校验器(失败原因:因为JDK6最高向下兼容到JDK1.2,而JDK1.2的class info 与JDK6的info存在较大的差异,所以新校验器可能会出现校验失败的情况)
-XX:+HandlePromotionFailurejava5以前是默认不启用,java6默认启用关闭新生代收集担保
-XX:LogFile=path设置日志文件的地址。默认情况下,文件被写到当前目录下,文件名为hotspot.log。一个示例如下:-XX:LogFile=/data/log/hotspot.log
-XX:+MaxFDLimit限于Solaris,默认启用设置java进程可用文件描述符为操作系统允许的最大值。
-XX:PreBlockSpin=10-XX:+UseSpinning 必须先启用,对于java6来说已经默认启用了,这里默认自旋10次控制多线程自旋锁优化的自旋次数
-XX:-RelaxAccessControlCheck默认不启用在Class校验器中,放松对访问控制的检查,作用与reflection里的setAccessible类似
-XX:+ScavengeBeforeFullGC默认启用在Full GC前触发一次Minor GC
-XX:+UseAltSigs限于Solaris,默认启用为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代 SIGUSR1和SIGUSR2
-XX:+UseBoundThreads限于Solaris, 默认启用绑定所有的用户线程到内核线程, 减少线程进入饥饿状态(得不到任何cpu time)的次数
-XX:+UseGCOverheadLimit默认启用限制GC的运行时间。如果GC耗时过长,就抛OOM
-XX:+UseLWPSynchronization限于solaris,默认启用使用轻量级进程(内核线程)替换线程同步
-XX:-UseSpinningjava1.4.2和1.5需要手动启用, java6默认已启用启用多线程自旋锁优化
-XX:+UseTLAB1.4.2以前和使用-client选项时,默认不启用,其余版本默认启用启用线程本地缓存区
-XX:+UseSplitVerifierjava5默认不启用, java6默认启用使用新的Class类型校验器
-XX:+UseThreadPriorities默认启用使用本地线程的优先级
-XX:+UseVMInterruptibleIO限于solaris,默认启用在solaris中,允许运行时中断线程

性能选项

参数说明默认值或限制
-XX:+AggressiveOpts启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等JDK 5 update 6后引入,但需要手动启用,。 JDK6默认启用
-XX:CompileThreshold=10000通过JIT编译器,将方法编译成机器码的触发阀值,可以理解为调用方法的次数。 例如调1000次,将方法编译为机器码1000
-XX:LargePageSizeInBytes=4m设置堆内存的内存页大小默认4m;amd64位:2m
-XX:MaxDirectMemorySize=size设置Java Nio可以使用的最大直接内存。默认情况下,该选项值为0,JVM将会自主确定一个大小值。
-XX:MaxHeapFreeRatio=70GC后,如果发现空闲堆内存占到整个预估上限值的70%,则收缩预估上限值。
预估堆内存是堆大小动态调控的重要选项之一。预估堆内存最大值一定小于或等于固定最大值(-Xmx指定的数值)。前者会根据使用情况动态调大或缩小,以提高GC回收的效率。 相关项:-XX:MinHeapFreeRatio=40
70
-XX:MaxMetaspaceSize=size元数据的最大值。(JDK8用此来替换PermSize) 可用k(K)或m(M)或g(G)为单位来设置。
-XX:MaxNewSize=size堆内存中新生代的最大值。1.3.1 Sparc: 32m;1.3.1 x86: 2.5m
-XX:MaxPermSize=64mPerm(永久代)占整个堆内存的最大值。 JDK8此选项已经废弃。使用此选项代替:-XX:MaxMetaspaceSize=size5.0以后: 64 bit VMs会增大预设值的30%, 1.4 amd64: 96m;1.3.1 -client: 32m; 其他默认 64m
-XX:MetaspaceSize=size元空间的大小。超过此大小会触发第一次垃圾回收。 可用k(K)或m(M)或g(G)为单位来设置。
-XX:MinHeapFreeRatio=40GC后,如果发现空闲堆内存占到整个预估上限值的40%,则增大上限值,但不超过固定最大值。 相关项:-XX:MaxHeapFreeRatio=7040
-XX:NewRatio=2新生代代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。 例如:2表示新生代与年老代比值为:1:2,新生代占整个堆内存的1/3。 Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。Sparc -client: 8;x86 -server: 8;x86 -client: 12;-client: 4 (1.3),8 (1.3.1+);x86: 12; 其他默认 2
-XX:NewSize=2.125m新生代预估上限的默认值。等价于-Xmn(新版本中没有了)5.0以后: 64 bit Vms 会增大预设值的30%;x86: 1m;x86, 5.0以后: 640k; 其他默认 2.125m
-XX:PermSize设置持久代(perm gen)初始值。 JDK8此选项已经废弃。使用此选项代替:-XX:MetaspaceSize
-XX:ReservedCodeCacheSize=32m设置代码缓存的最大值,编译时用Solaris 64-bit, amd64, -server x86: 48m;1.5.0_06之前, Solaris 64-bit amd64: 1024m; 其他默认 32m
-XX:SurvivorRatio=8Eden与Survivor的比值。例如:设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
因为我们的新生代有2个survivor,即S0和S1。
Solaris amd64: 6, Sparc in 1.3.1: 25, Solaris platforms 5.0以前: 32, 其他默认 8
-XX:TargetSurvivorRatio=50实际使用的survivor空间大小占比。默认是50%,最高90%50
-XX:ThreadStackSize=512线程堆栈大小。等价于-Xss。Sparc: 512, Solaris x86: 320 (5.0以前 256), Sparc 64 bit: 1024;Linux amd64: 1024 (5.0 以前 0); 其他默认 512。(0 means use default stack size) 
-XX:+UseBiasedLocking启用偏向锁JDK 5 update 6后引入,但需要手动启用,。JDK6默认启用
-XX:+UseFastAccessorMethods优化原始类型的getter方法性能(get/set:Primitive Type)默认启用
-XX:-UseISM启用solaris的ISM默认启用
-XX:+UseLargePages启用大内存分页JDK 5 update 5后引入,但需要手动启用, JDK6默认启用
-XX:+UseMPSS启用solaris的MPSS,不能与ISM同时使用1.4.1 之前: 不启用, 其余版本默认启用
-XX:+UseStringCache启用缓存常用的字符串。默认开启
-XX:AllocatePrefetchLines=1Number of cache lines to load after the last object allocation using prefetch instructions generated in JIT compiled code. Default values are 1 if the last allocated object was an instance and 3 if it was an array.1
-XX:AllocatePrefetchStyle=1Generated code style for prefetch instructions.
0 – no prefetch instructions are generate*d*,
1 – execute prefetch instructions after each allocation,
2 – use TLAB allocation watermark pointer to gate when prefetch instructions are executed.
1
-XX:+UseCompressedStrings其中,对于不需要16位字符的字符串,可以使用byte[] 而非char[]。对于许多应用,这可以节省内存,但速度较慢(5%-10%)Java 6 update 21有一选项
-XX:+OptimizeStringConcat优化字符串连接操作在可能的情况下在Java 6更新20中引入

调试选项

选项默认值或限制说明
-XX:-CITime打印花费在JIT编译上的时间
-XX:ErrorFile=./hs_err_pid<pid>.logJDK6中引入错误文件
-XX:-ExtendedDTraceProbesJDK6中引入仅在Solaris启用性能的影响DTrace探测器
-XX:HeapDumpPath=./java_pid<pid>.hprof1.4.2 update 12, 5.0 update 7指定HeapDump的文件路径或目录。 默认文件存储在当前路径下,文件名为java_pid[pid].hprof。 示例(%p表示进程PID):-XX:HeapDumpPath= /data/log/java_pid%p.hprof
-XX:-HeapDumpOnOutOfMemoryError1.4.2 update 12, 5.0 update 7开启堆转储功能。当Java应用抛出OutOfMemoryError异常时会用堆转储工具(HPROF)将Java堆存储到文件中。
可使用选项-XX:HeapDumpPath=path指定文件路径。
-XX:OnError=”<cmd args>;<cmd args>”1.4.2 update 9当发生错误时执行用户指定的命令
-XX:OnOutOfMemoryError=”<cmd args>;
<cmd args>”
1.4.2 update 12, 6当发生OOM时执行用户指定的命令。设置发生OutOfMemoryError后执行的处理命令,多个命令可使用分号;分隔。如果命令中含有空格,需要使用双引号”包裹命令。
-XX:-PrintClassHistogram1.4.2当Ctrl+Break发生时打印Class实例信息,与jmap -histo相同
-XX:-PrintConcurrentLocks6当Ctrl+Break发生时打印java.util.concurrent的锁信息, 与jstack -l相同
-XX:-PrintCommandLineFlags5打印命令行上的标记
-XX:-PrintCompilation当方法被编译时打印信息
-XX:+PrintFlagsFinal打印配置。
-XX:-PrintGC当GC发生时打印信息
-XX:-PrintGCDetails1.4.0打印GC详细信息
-XX:-PrintGCTimeStamps1.4.0打印GC用时
-XX:-PrintTenuringDistribution打印Tenuring年龄信息
-XX:-TraceClassLoading跟踪类加载
-XX:-TraceClassLoadingPreorder1.4.2跟踪所有加载的引用类
-XX:-TraceClassResolution1.4.2跟踪常量池的变化
-XX:-TraceClassUnloading跟踪类的卸载
-XX:-TraceLoaderConstraints6Trace recording of loader constraints
-XX:+PerfSaveDataToFile退出时保存jvmstat二进制文件
-XX:+UseCompressedOopsEnables the use of compressed pointers (object references represented as 32 bit offsets instead of 64-bit pointers) for optimized 64-bit performance with Java heap sizes less than 32gb.
-XX:+AlwaysPreTouchPre-touch the Java heap during JVM initialization. Every page of the heap is thus demand-zeroed during initialization rather than incrementally during application execution.
-XX:AllocatePrefetchDistance=Sets the prefetch distance for object allocation. Memory about to be written with the value of new objects is prefetched into cache at this distance (in bytes) beyond the address of the last allocated object. Each Java thread has its own allocation point. The default value varies with the platform on which the JVM is running.
-XX:InlineSmallCode=当编译的代码小于指定的值时,内联编译的代码
-XX:MaxInlineSize=35内联方法的最大字节数
-XX:FreqInlineSize=内联频繁执行的方法的最大字节码大小
-XX:LoopUnrollLimit=Unroll loop bodies with server compiler intermediate representation node count less than this value. The limit used by the server compiler is a function of this value, not the actual value. The default value varies with the platform on which the JVM is running.
-XX:InitialTenuringThreshold=7设置初始的对象在新生代中最大存活次数
-XX:MaxTenuringThreshold=设置对象在新生代中最大的存活次数,最大值15,并行回收机制默认为15,CMS默认为4

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录