java


该命令启动Java程序,通过JVM加载指定主类并调用main方法实现,main方法必须声明为:

public static void main(String[] args)

详情页面:https://docs.oracle.com/en/java/javase/13/docs/specs/man/java.html

执行启动类

  • java[ options ] mainclass [ args ...]
代码
java HelloJaotc

执行Jar中的启动类

  • java [options] -jar jarfile [args ...]
代码
java -jar HelloJaotc.jar

执行module中的启动类

  • java [options] --module module[/mainclass] [args ...]

java命令 选项参数

  • 标准选项:保证所有JVM都会实现,例如检查JRE版本,设置classpath等命令。
  • 附加选项:特定于Hot Spot的通用选项,不能保证所有JVM都会实现,并且这些命令可能会发生改变,这种类型选项一般以-X开头。
  • 高级选项:这些选项针对于开发人员,用于JVM调优,不能保证所有JVM都会实现,并且这些命令可能会发生改变,这种类型选项一般以-XX开头。

Advanced Runtime Options for Java:控制运行时的JVM

Advanced JIT Compiler Options for java:控制JIT的动态编译

Advanced Serviceability Options for Java:启用收集系统信息并执行广泛的调试

Advanced Garbage Collection Options for Java:控制Java HotSpot如何执行垃圾收集(GC)

例如:

  • 高吞吐量
代码
java -server -XX:+UseParallelGC -XX:+UseLargePages -Xmn10g  -Xms26g -Xmx26g
  • 低延时
代码
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100
  • 缩小Java堆并降低嵌入式APP的动态足迹
代码
java -XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5

Java的标准选项

​ 长选项参数的两种方式:--name=value 或 --name value。

  • -agentlib:libname[=options]

    加载本地指定代理库,后边跟库名,用逗号(,)分割多个库。

    • Oracle Solaris,Linux和macOS:如果指定了**-agentlib:foo**,那么JVM会尝试加载在系统变量 LD_LIBRARY_PATH (MacOS为 DYLD_LIBRARY_PATH )的 libfoo.so.
    • Windows:如果指定了**-agentlib:foo**,JVM会尝试加载在系统变量PATH位置中命名的foo.dll。
    • 以下是加载JAVA调试协议库,并监听8000端口,从而在主类加载之前挂起。
    代码
    -agentlib:jdwp=transport=dt_socket,server=y,address=8000
    
  • -agentpath:pathname[=options]:通过绝对路径加载本地代理库,等效于 -agentlib

  • --class-path classpath, -classpath classpath, or -cp classpath

    指定classpath目录,jar包,zip包,用分号(;)分割。

    这个选项会覆盖 CLASSPATH 环境变量的设置,若未设置该选项,则classpath默认是当前目录。

    为了方便,dir/* 这种目录会加载 dir 目录下的所有.jar和.JAR文件(包含隐藏文件),CLASSPATH 环境变量也可设置(*)。

    Java程序永远看不到Jvm启动之前的通配符扩展。除非查询环境变量,例如:System.getenv("CLASSPATH")

  • --disable-@files

    可以在命令行的任何位置使用,防止 @filename 进一步扩展,该选项停止扩展该选项后的 @-argfiles

  • --enable-preview:启用预览功能。

  • --module-path modulepath... or -p modulepath:以分号(;)分割的目录列表,每个目录都是一个module。

  • --upgrade-module-path modulepath...

    以分号(;)分割的目录列表,这些目录会替换运行时镜像中可升级的module。

  • --add-modules:附加module,module可以是ALL-DEFAULT, ALL-SYSTEM, ALL-MODULE-PATH.

  • --list-modules:输出可查看的module列表,然后退出。

  • -d module_name or --describe-module module_name:输出指定module的描述,然后退出。

  • --dry-run:创建VM但不执行main方法。该选项在校验命令行选项(如:模块系统配置)时比较有用。

  • --validate-modules:验证所有module,然后退出。

  • -Dproperty=value

    设置系统属性值,property是一个没有空格的字符串,若value是包含空格的字符串,需要用引号包起来。(例如-Dfoo="foo bar")

  • -disableassertions[:[packagename]...|:classname] 或 -da[:[packagename]...|:classname]:

    禁用asset断言。默认禁用所有包和类的断言。不带参数时,默认禁用所有包和类的断言。

  • -disablesystemassertions or -dsa:禁用所有系统类断言。

  • -enableassertions[:[packagename]...|:classname] or -ea[:[packagename]...|:classname]

    启用指定包或类的断言。

  • -enablesystemassertions or -esa:启用所有系统类的断言。

  • -javaagent:jarpath[=options]:加载指定编程语言的代理,具体可参考java.lang.instrument

  • --show-version:将生产版本打印到输出流并继续执行。

  • -showversion:将生产版本打印到错误流并继续执行。

  • --show-module-resolution:输出启动期间的模块解析。

  • -verbose:class:显示已加载类的信息。

  • -verbose:gc:显示每次垃圾回收事件的信息。

  • -verbose:jni:显示使用本地方法和JNI的活动信息。

  • -verbose:module:显示正在使用的module信息。

  • --version 或 -version:打印生产版本并退出。

  • -X 或 --help-extra:打印附加选项到输出流并退出。

  • @argfile

    通过java命令指定以 @ 为前缀的一个或多个参数文件。由于classpath会有jar文件路径,因此命令行可能会很长。

Java的附加选项

​ 以下选项是HotSpot虚拟机的通用选项。

  • -Xbatch

    禁用后台编译,默认情况下,JVM以后台任务编译方法,在后台编译完成之前,JVM会以解释器模式执行方法。该选项将方法编译作为前台任务执行,直到全部编译完成。该命令等效于:-XX:-BackgroundCompilation

  • -Xbootclasspath/a:directories|zip|JAR-files

    指定目标列表,可以是目录/jar包/zip包,附加到默认根加载器路径的末尾。

    • Oracle Solaris, Linux, and macOS:用冒号(:)分割。
    • Windows:用分号(;)分割。
  • -Xcheck:jni

    JNI 函数执行附加校验。具体来说,在处理 JNI 请求之前,验证传递给 JNI 函数的参数和运行时环境的数据。它还检查 JNI 调用期间未解决的异常。该选项会导致性能下降。

  • -Xcomp

    首次调用就强制编译方法。默认情况下,ClientVM执行1000次,ServerVM执行10000次才会编译方法。也可以通过 -XX:CompileThreshold 参数设置方法编译所需执行方法次数的阈值。

  • -Xdebug:暂时没啥作用,保留选项。

  • -Xdiag:显示附加选项信息。

  • -Xint:禁用对本机代码进行编译,仅以解释模式运行应用程序,此选项无法获得 JIT 的性能优势。

  • -Xinternalversion:打印比 -version 更详细的版本信息,然后退出。

  • -Xlog:option

    配置或启用 JVM 统一日志框架,详见:Enable Logging with the JVM Unified Logging Framework

  • -Xmixed:除热方法外,其他全部都是由解释器执行。

  • -Xmn size

    设置年轻代堆的初始容量和最大容量,默认是字节单位,智能识别k/K/m/M/g/G单位。

    由于年轻代执行GC的频率很高,若设置太小就会导致频繁GC,若设置太大就会导致GC一次耗时太长。

    建议不要对G1回收器设置年轻代大小,并保持年轻代大小是其他收集器的整个堆大小的25%-50%。

    例如:

    -Xmn256m -Xmn262144k -Xmn268435456

    该参数可以拆分为两个参数:

    • -XX:NewSize:设置年轻代的初始容量
    • -XX:MaxNewSize:设置年轻代的最大容量
  • -Xms size

    设置对的初始和最小容量,该值必须是1024的倍数并且大于1MB。例如:

    -Xms6291456 -Xms6144k -Xms6m

    该参数可以拆分为两个参数:

    • -XX:MinHeapSize:设置堆的最小容量
    • -XX:InitialHeapSize:设置堆的初始容量

    若未设置此选项,默认将初始大小设置为年轻代和老年代之和。

  • -Xmx size

    设置堆的最大容量,该值必须是1024的倍数并且大于1MB,等效于-XX:MaxHeapSize。例如:

    -Xmx83886080 -Xmx81920k -Xmx80m

  • -Xnoclassgc

    禁用类的垃圾收集。虽然节省了一些GC和APP的中断时长,但这选项可能会导致内存不足的异常。

  • -Xrs

    减少 JVM 对操作系统信号的使用,即使 JVM 突然终止,ShutdownHook也可以有序的执行用户清除代码(例如关闭线程池,连接池)。

    Oracle Solaris, Linux, and macOS:

    • JVM 通过捕获信号来执行意外终止的shutdown hook代码,JVM 使用了 SIGHUP, SIGINT, and SIGTERM 来初始化shuwdown hook的运行。
    • 嵌入式 JVM APP经常要捕获 SIGINT or SIGTERM,这可能会干扰 JVM 的信号处理程序。-Xrs选项可以解决此问题。当启用-Xrs时,JVM 将不会安装这些信号处理程序。

    Windows:

    • JVM 监视控制台事件来执行意外终止的shutdown hook代码,具体来说,JVM 会注册一个控制台控制处理程序来执行shutdown hook,但是CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT会返回TRUE。
    • JVM 使用相似的机制来实现调试时dump线程堆栈,JVM 使用 CTRL_BREAK_EVENT 来执行dump线程。
    • JVM 以服务形式运行,它可以接收 CTRL_LOGOFF_EVENT 事件,但不执行shutdown hook代码,因为操作系统并未终止该服务进程。为避免此类干扰,-Xrs 可以解决此问题。应用-Xrs之后,JVM 不会安装控制台控制处理程序,意味着 JVM 不再关心 CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT 事件。

    指定-Xrs有2个结果:

    • Oracle Solaris, Linux, and macOS:SIGQUIT dump 线程不可用。
    • Windows:Ctrl + Break dump线程不可用。

    User code is responsible for causing shutdown hooks to run, for example, by calling the System.exit() when the JVM is to be terminated.

  • -Xshare:mode

    设置类数据共享模式,鉴于操作系统的地址空间布局随机化可能会导致间歇性故障而慎用。

    mode可选值:

    • auto:默认为此选项,如果可以,则选择共享类数据。
    • on:开启类数据共享模式,仅用于测试目的,禁止用于生产环境。
    • off:不共享类数据。
  • -XshowSettings:显示所有设置,然后继续执行。

  • -XshowSettings:category

    显示设置信息并继续,category可选值有:

    • all:默认为此选项,显示所有类别的设置。
    • locale:显示语言环境相关设置。
    • properties:显示系统属性相关的设置。
    • vm:显示 JVM 相关的设置。
    • system:
      • Linux:显示主机系统或容器配置。
  • -Xss size

    设置线程栈大小,默认值取决于平台:

    • Linux/x64 (64-bit):1024kb
    • MacOS (64-bit):1024KB
    • Oracle Solaris (64-bit): 1024 KB
    • Windows:默认值取决于虚拟内存。

    此选项类似于-XX:ThreadStackSize。

  • --add-reads module=target-module(,target-module)*

    Updates module to read the target-module, regardless of the module declaration. target-module can be all unnamed to read all unnamed modules.

  • --add-exports module/package=target-module(,target-module)*

    Updates module to export package to target-module, regardless of module declaration. The target-module can be all unnamed to export to all unnamed modules.

    例如:

    --add-exports java.desktop/sun.awt.shell=ALL-UNNAMED

  • --add-opens module/package=target-module(,target-module)*

    Updates module to open package to target-module, regardless of module declaration.

  • --illegal-access=parameter

    当运行时出现,可以通过该参数指定操作模式:

    ​ 该选项将在未来版本删除。

    • permit:默认模式。若JDK8中存在该程序包,此模式会在运行时镜像中打开每个module中的每个package,以对所有未命名的module(例如classpath中的代码)进行编码。这将启用两个静态访问(例如,字节码编译,深度反射访问)通过平台反射API。对任何此类package的首次反射访问操作都会发出警告消息。
    • warn:该模式除了对每个非法的反射访问发出警告消息外与permit完全相同。
    • debug:该模式除了对每个非法反射访问发出警告消息和堆栈跟踪信息外与warn完全相同。
    • deny:该模式禁用所有非法访问操作,但其他命令行选项(例如--add-open)除外。在将来版本中,该选项会称为默认选项。

MacOS的附加选项

  • -XstartOnFirstThread:在第一个AppKit线程上运行main方法。
  • -Xdock:name=application_name:覆盖在程序坞中显示的默认应用程序名称。
  • -Xdock:icon=path_to_icon_file:覆盖在程序坞中显示的默认应用程序图标。

Java的高级选项

  • -XX:+UnlockDiagnosticVMOptions:默认禁用
  • -XX:+UnlockExperimentalVMOptions:默认禁用

Java运行时的高级选项

  • -XX:ActiveProcessorCount=x

    默认GC和ForkJoinPool的线程池大小是CPU个数,该选项可以重新指定这些线程池的容量。

    VM通常从操作系统得知CPU数量,在Docker容器中执行多个Java程序时,该选项对于分区CPU资源很有用,即使 UseContainerSupport 未启用。

  • -XX:AllocateHeapAt=path

    采用文件系统路径并且使用内存映射来分配对象堆。

  • -XX:-CompactStrings

    禁用字符串压缩功能。默认启用该选项。启用该选项后,内部仅含单字节字符的String将使用ISO-8859-1/Latin-1 编码在内部表示并存储。对于至少包含一个多字节字符的String,就会采用UTF-16编码。

    禁用此选项在以下2种情况效果较好:

    • 已知代码中存在大量的多字节字符串。
    • Java8迁移到Java9中观察到性能意外下降,有分析表明该选项导致性能回退。
  • -XX:ErrorFile=filename

    当APP发生不可恢复的错误时,将错误数据写入指定的filename中。默认情况下,此文件在当前工作目录创建,并命名为 hs_err_pid [pid].log,其中pid是出错的进程ID。

    例如:(%p是进程ID通配符)

    -XX:ErrorFile=./hs_err_pid%p.log

    若文件存在并可写,那么它将会覆盖原文件,如果由于空间不足/权限问题而无法创建文件,则会在操作系统的临时目录创建文件。

  • -XX:+ExtensiveErrorReports

    默认禁用此选项,启用此选项可以获得更详细的错误信息,因此错误日志文件会非常大。

  • -XX:FlightRecorderOptions=parameter=value 或 -XX:FlightRecorderOptions:parameter=value

    设置控制 JFR 行为的参数。

    以下是可选值:

    • globalbuffersize=size:指定用于保留数据的主存容量。默认值是基于参数memorysize。

    • maxchunksize=size:

      指定记录中数据块的最大size。为了方便,支持m/M/g/G单位。默认值最大size为12MB,最小size为1MB。

    • memorysize=size:确定应该使用多少缓冲存储器,为了方便,支持m/M/g/G单位。默认为10MB。

    • numglobalbuffers:指定使用的全局缓冲区数量。默认值基于 memorysize 参数,会跟随 memorysize 的变化而变化。

    • old-object-queue-size=number-of-objects:跟踪最大old对象数。默认为256。

    • repository=path:指定临时文件目录,默认为系统临时目录。

    • retransform={true|false}:是否使用 JVMTI 重新转换event classes。默认启用该参数。

    • samplethreads={true|false}:是否启用线程采样。只有 sampling event和samplethreads同时开启才会进行线程采样。默认启用该参数。

    • stackdepth=depth:堆栈跟踪的栈深度。默认是64,最大为2048,大于64可能会降低性能。

    • threadbuffersize=size:

      指定每个线程的本地缓冲区大小。默认是8KB,最小值为4KB,配置不好可能会降低性能,建议不要修改此参数。

    可以通过逗号(,)分割多个参数。例如:

    -XX:FlightRecorderOptions=globalbuffersize=2048,maxchunksize=4096

  • -XX:LargePageSizeInBytes=size

    设置Java堆使用large pages的最大size。该参数必须是2的幂次方,允许添加k/k/m/M/g/G单位。默认为0,以为 JVM 会自动为large pages选择大小,详见:Large Pages ,例如:

    -XX:LargePageSizeInBytes=4m

  • -XX:MaxDirectMemorySize=size

    设置 java.nio 包使用的 **direct-buffer ** 最大容量。默认为0,意味着 JVM 会自动为其选择大小。例如:

    -XX:MaxDirectMemorySize=1m -XX:MaxDirectMemorySize=1024k -XX:MaxDirectMemorySize=1048576

  • -XX:-MaxFDLimit:禁止将FD数量的软限制改为硬限制。

  • -XX:NativeMemoryTracking=mode

    指定 JVM 跟踪native memory使用情况的模式。

    • off:不跟踪native memory使用情况,默认为此模式。
    • summary:仅跟踪 JVM 子系统(例如Java堆,类,代码和线程)的内存使用情况。
    • detail:除了summary模式之外,还会跟踪 各个CallSite各个虚拟内存区域及它们的提交区域 的内存使用情况。
  • -XX:ObjectAlignmentInBytes=alignment

    设置Java对象的内存对齐方式,默认为8字节,该值应为2的幂次方,并且 8 <= alignment <= 256。该选项使得 在large heap上使用压缩指针成为可能。

    堆最大限制 = 4GB * ObjectAlignmentInBytes。

    注意:alignment越大,对象间空隙越多,因此在large heap上使用压缩指针可能没有什么好处。

  • -XX:OnError=string

    当不可恢复的错误发生,可以执行一系列用分号(;)分割的命令列表,如果命令中存在空格,需要用引号括起来。

    • Oracle Solaris,Linux和macOS:以下例子表明当程序发生不可恢复得错误时使用gcore创建核心镜像,然后使用GDB调试器附加到进程。(%p代表进程ID)

      -XX:OnError="gcore %p;gdb -p %p"

    • Windows:以下例子表明当程序发生不可恢复得错误时,使用 userdump.exe 获取crash dump。(假定userdump.exe已经在PATH环境变量中配好)

      -XX:OnError="userdump.exe %p"

  • -XX:OnOutOfMemoryError=string

    OutOfMemoryError 首次发生时,执行得一系列命令,可参考-XX:OnError。

  • -XX:+PrintCommandLineFlags:打印便于阅读得命令行参数列表。

    代码
    -XX:G1ConcRefinementThreads=4 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=267879168 -XX:MaxHeapSize=4286066688 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation 
    
  • -XX:+PreserveFramePointer

    • -XX:-PreserveFramePointer:使用RBP寄存器作为通用寄存器
    • -XX:+PreserveFramePointer:使用RBP寄存器保存当前执行方法得帧指针。

    如果帧指针可用,外部性能分析工具(例如:Linux perf)能构造更准确得堆栈跟踪。

  • -XX:+PrintNMTStatistics

    当native memory跟踪被启用时(-XX:NativeMemoryTracking),启用在 JVM 退出时打印收集的native memory跟踪数据。默认此选项被禁用,native memory跟踪数据不会打印。

  • -XX:SharedArchiveFile=path:指定类数据共享的路径或文件。详见:Application Class Data Sharing

  • -XX:SharedArchiveConfigFile=shared_config_file:指定添加到 archive 文件中的共享数据。

  • -XX:SharedClassListFile=file_name

    指定一个文本文件,该文本文件包含要存储在CDS archive 文件中类名。每行是一个类的全限定类名,使用 / 替换 . ,例如指定java.lang.Object和hello.World类,创建一个文本文件,内容为:

    java/lang/Object hello/Main

    可以在此文件中指定应用程序中常用的类,这些类可以是 app classpath,ext classpath,bootstrap classpth的类。详见: Application Class Data Sharing

  • -XX:+ShowMessageBoxOnError

    JVM 遇到不可恢复的错误时,弹出对话框以防止 JVM 退出并使进程保持活动状态,以便附加调试器查看错误原因,默认此选项是禁用的。

  • -XX:StartFlightRecording=parameter=value

    启用 Java 应用的 JFR 记录,该选项等效于在运行期间开始记录的 JFR.start 诊断命令。当开始 JFR 记录时,可以设置以下参数:

    • delay=time

      指定Java应用启动后延时多久开始记录,为了方便支持s/m/h/d为单位,默认为0。

    • disk={true|false}:是否在记录时将数据写入磁盘,默认启用该选项。

    • dumponexit={true|false}

      是否在 JVM 停止时dump运行期间的记录。如果该选项启用切 filename 选项未设置,该记录文件将会写到进程启动的目录下。该文件名是系统生成的,含有进程ID,记录ID,当前时间戳,形如hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr。默认禁用此选项。

    • duration=time:指定记录持续时长,支持s/m/h/d单位,默认为0,意味着不做限制。

    • filename=path

      指定记录写入的文件名,例如:

      • recording.jfr
      • /home/user/recordings/recording.jfr
      • c:\recordings\recording.jfr
    • name=identifier:同时获得记录名称和标识符。

    • maxage=time

      指定记录在磁盘的文件保留时长。当disk=true时,该参数才有效。支持s/m/h/d单位,默认为0,意味着不做限制。

    • maxsize=size

      存储在磁盘的记录文件的最大长度,当disk=true时,该参数才有效。支持m/M/g/G单位。默认为0,意味着不做限制。

    • path-to-gc-roots={true|false}

      指定在记录结束时收集GC Roots路径。默认禁用该选项。

      GC Roots 路径在查找内存泄露时比较有用,但是收集它很耗时。仅当程序疑似存在内存泄露,才启用该选项开始记录程序。如果 setting 参数设置为 profile ,收集信息包含 潜在泄露对象的堆栈跟踪

    • setting=path

      指定event设置文件。默认使用 JRE_HOME/lib/jfr/default.jfc

    可以使用逗号(,)分割命令列表。

  • -XX:-UseBiasedLocking:禁用偏向锁,默认启用偏向锁。例如StringBuffer在单线程中使用,开启偏向锁后可以提高显着的性能。

  • -XX:-UseCompressedOops

    禁用压缩指针。默认使用压缩指针。这将会根据压缩指针覆盖的最大内存容量来自动限制 Java堆容量。

    启用压缩Oop之后,对象引用将会是4字节而不是8字节,当 Java 堆容量 小于 压缩指针覆盖的范围,会获得性能提升。

    可以使用 Java 堆容量 大于32GB的压缩指针。详见:-XX:ObjectAlignmentInBytes 选项。

  • -XX:-UseContainerSupport

    VM支持自动发现容器,运行在Docker容器中的Java程序,允许VM去决定使用内存容量和CPU核心数。该选项仅在Linux x64平台上可用,如果平台支持,该选项默认为true。

    通过 -Xlog:os+container=trace 选项来获得最多的容器信息。详见: Enable Logging with the JVM Unified Logging Framework

  • -XX:+UseHugeTLBFS

    仅限Linux:该选项等效于 -XX:+UseLargePages。默认禁用该选项。详见:Large Pages

  • -XX:+UseLargePages

    开启 使用 large pages 内存。默认禁用该选项。

  • -XX:+UseTransparentHugePages

    仅限Linux:启用对可以动态增长和收缩的large pages的使用。默认禁用该选项。

  • -XX:+AllowUserSignalHandlers:允许应用程序安装信号处理程序,默认禁用该选项。

  • -XX:VMOptionsFile=filename

    允许用户在文件中编写选项列表,例如:java -XX:VMOptionsFile=/var/my_vm_options HelloWorld

Java 的 JIT 编译器选项

  • -XX:AllocateInstancePrefetchLines=lines

    实例分配指针之前预读的行数,默认为1。

    仅在Java Hot Spot Server VM支持。

  • -XX:AllocatePrefetchDistance=size

    实例分配预取的内存长度,默认为-1。负数代表取决于平台,允许k/Km/M/g/G单位。

    仅在Java Hot Spot Server VM支持。

  • -XX:AllocatePrefetchInstr=instruction

    设置分配指针的预取指令,可能取值是0/1/2/3,实际指令依赖于平台,默认为0。

    仅在Java Hot Spot Server VM支持。

  • -XX:AllocatePrefetchLines=lines

    使用编译代码生产的预取指令,在最后一个对象分配之后要加载的缓存行数。

    若最后一个对象是实例,则默认值为1。

    若最后一个对象是数组,则默认值是3。

    仅在Java Hot Spot Server VM支持。

  • -XX:AllocatePrefetchStepSize=size

    顺序预取指令的步长,允许k/Km/M/g/G单位。默认为16字节。

    仅在Java Hot Spot Server VM支持。

  • -XX:AllocatePrefetchStyle=style

    预取指令的生成代码样式。可取0/1/2/3。

    • 0:不要生成预取指令
    • 1:每次分配后执行预取指令,此为默认风格
    • 2:使用 TLAB (ThreadLocal Allocation Block)水印(watermark)指针来决定何时执行预取指令
    • 3:在 SPARC 上使用 BIS 指令进行分配预取。

    仅在Java Hot Spot Server VM支持。

  • -XX:+BackgroundCompilation:启用后台编译,默认启用。禁用等效于-Xbatch。

  • -XX:CICompilerCount=threads:用于编译的编译器线程数。默认ServerVM为2,ClientVM为1.

  • -XX:CompileCommand=command,method[,option]

    指定要对某个方法执行的command命令。

    例如:

    1. 排除对java.lang.String类的indexOf进行编译:

    -XX:CompileCommand=exclude,java/lang/String.indexOf

    1. 指定类名必须是全限定类名,可以用 /. 分割包:

    -XX:CompileCommand=exclude,java.lang.String::indexOf

    1. 若没有指定方法签名,将会对这个方法的所有重载进行操作,也可指定方法签名:

    -XX:CompileCommand="exclude,java/lang/String.indexOf,(Ljava/lang/String;)I"

    1. 也可使用通配符指定类或方法名,如排除所有类中的indexOf方法:

    -XX:CompileCommand=exclude,*.indexOf

    1. 逗号(,)和句点(.)是空格的别名,因此还可以这么写:

    -XX:CompileCommand="exclude java/lang/String indexOf"

    注意:使用该选项解析命令行上的参数之后,JIT 编译器随后从 .hotspot_compiler 文件读取命令,你可以添加命令到此文件,或者通过 -XX:CompileCommandFile 指定一个文件。

    要添加多个命令,可以多次指定该选项,或者通过 \n 分割。命令可选列表如下:

    • break:设置一个断点,当指定方法编译开始时停止。

    • compileonly:仅编译该命令指定的方法列表。可参考-XX:CompileOnly。

    • dontinline:防止内联指定方法。

    • help:打印-XX:CompileCommand的帮助信息。

    • inline:尝试内联指定的方法。

    • log:排除指定方法之外的所有方法的编译日志(通过-XX:+LogCompilation启用)。

    • option:将 JIT 编译选项参数传递给指定方法。例如对StringBuffer的append方法启用BlockLayoutByFrequency选项:

      -XX:CompileCommand=option,java/lang/StringBuffer.append,BlockLayoutByFrequency

      可以指定多个编译选项,用逗号(,)或空格分割。

    • print:在编译指定的方法后打印生成的汇编代码。

    • quiet:不打印编译命令,默认将会打印-XX:CompileCommand指定的命令。例如,排除String类的indexOf方法,将会输出:

      CompilerOracle: exclude java/lang/String.indexOf

      你可以让-XX:CompileCommand=quiet在其他-XX:CompileCommand之前指定。

  • -XX:CompileCommandFile=filename

    JIT 编译器 会从该文件读取命令来执行。默认情况下,filename为 .hotspot_compiler

    例如,以下命令为 String 类的 toString 方法打印汇编代码:

    print java/lang/String toString

  • -XX:CompilerDirectivesFile=file

    当程序启动时,将指令从文件中添加到指令栈。

    该指令与-XX:UnlockDiagnosticVMOptions一起使用。

  • -XX:+CompilerDirectivesPrint

    当程序启动或新指令被添加时,输出指令栈。

    该指令与-XX:UnlockDiagnosticVMOptions一起使用。

  • -XX:CompileOnly=methods

    设置编译应被限制的方法列表。仅编译指定的方法。指定的方法必须包含包名和类名。

    例如仅编译String的length和List的size方法:

    -XX:CompileOnly=java/lang/String.length,java/util/List.size

    注意:全限定类名使用 / 分割,为了方便剪切和粘贴操作,也可以使用XX:+PrintCompilation 和 -XX:+LogCompilation生成的方法名:

    -XX:CompileOnly=java.lang.String::length,java.util.List::size

    虽然不支持通配符,但是可以指定类或包中的所有方法,还可以指定任何类中的指定方法:

    -XX:CompileOnly=java/lang/String -XX:CompileOnly=java/lang -XX:CompileOnly=.length

  • -XX:CompileThreshold=invocations

    设置调用指定次数后编译该方法。

    启用分层编译时,将会忽略该选项,详见选项-XX:-TieredCompilation。

    选项-Xcomp将会禁用解释器模式执行,首次调用就会编译方法。

  • -XX:CompileThresholdScaling=scale

    提供首次编译的同意控制。该选项控制方法首次编译操作的分层和非分层模式。

    该选项介于0和+Inf之间的整数值,并缩放与当前操作模式(分层 / 非分层)对应的阈值。

    当scale = 0时,表明禁用编译。

    当scale > 1.0时,表明延迟编译。

    当scale < 1.0时,表明较早编译。

  • -XX:+DoEscapeAnalysis

    启用转义分析的使用。默认启用该选项。

    仅在Java Hot Spot Server VM支持。

  • -XX:InitialCodeCacheSize=size:设置初始代码缓存大小,支持k/K/m/M/g/G 单位。

  • -XX:+Inline:启用方法内联。默认启用该选项以提高性能。

  • -XX:InlineSmallCode=size

    设置已编译方法应内联的最大代码阈值,支持k/K/m/M/g/G 单位。

  • -XX:+LogCompilation

    启用将编译活动的日志记录到当前目录下的 hotspot.log 文件中。

    也可以通过-XX:LogFile指定其他路径和文件名。

    默认禁用该选项,该选项必须跟 -XX:UnlockDiagnosticVMOptions 选项一起使用来解锁诊断 JVM 选项。

    每次使用 -XX:+PrintCompilation 选项编译方法时,都可以打印详细的诊断输出到控制台。

  • -XX:MaxInlineSize=size

    设置要内联的方法的最大字节码大小阈值,支持k/K/m/M/g/G 单位。

  • -XX:MaxNodeLimit=nodes

    设置单个方法编译期间要使用的最大节点数,默认为65000。

  • -XX:NonNMethodCodeHeapSize=size

    设置包含非方法代码的代码段的大小,例如编译器缓冲区,字节码解释器,此代码类型永远保留在代码缓存中。该选项仅在 -XX:SegmentedCodeCache 启用时有效。

  • -XX:NonProfiledCodeHeapSize=size

    设置包含nonprofiled 方法代码段的大小。该选项仅在 -XX:SegmentedCodeCache 启用时有效。

  • -XX:MaxTrivialSize=size

    设置要内联的不重要方法的最大字节码大小阈值,支持k/K/m/M/g/G 单位。

  • -XX:+OptimizeStringConcat

    启用优化字符串连接操作,默认启用。

    仅在Java Hot Spot Server VM支持。

  • -XX:+PrintAssembly

    通过外部 hsdis-<arch>.so(dll) 来打印字节码或本地方法的汇编代码。对于Windows上的64bitVM,它是 hsdis-amd64.dll

    该选项必须跟 -XX:UnlockDiagnosticVMOptions 选项一起使用来解锁诊断 JVM 选项。

  • -XX:ProfiledCodeHeapSize=size

    设置包含profiled 方法代码段的大小。该选项仅在 -XX:SegmentedCodeCache 启用时有效。

  • -XX:+PrintCompilation

    每次编译方法时,将 JVM 的详细诊断输出到控制台。

    可以使用 -XX:+LogCompilation 将信息输出到文件。

  • -XX:+PrintInlining

    启用打印内联决策信息。可查看那些方法被内联。

    默认禁用该选项,该选项必须跟 -XX:UnlockDiagnosticVMOptions 选项一起使用来解锁诊断 JVM 选项。

  • -XX:ReservedCodeCacheSize=size

    设置 JIT 编译代码的最大缓存大小,支持k/K/m/M/g/G 单位。

    默认最大缓存为240MB,若禁用 -XX:-TieredCompilation 选项,默认为48MB。

    该选项上限为2GB。

    最大缓存大小应该大于初始缓存大小(-XX:InitialCodeCacheSize)。

  • -XX:RTMAbortRatio=abort_ratio

    将该 RTM 终止比率指定为 所有 已执行 RTM 事务的百分比。若终止事务数量变得大于该比率,则对编译后的代码进行优化。若 -XX:+UseRTMDeopt 选项被启用,就会使用该比率。

    默认为50%。

  • -XX:RTMRetryCount=number_of_retries

    指定RTM锁定代码在中止或繁忙时重试到正常锁定机制之前的重试次数。

    默认值为5,必须启用 -XX:UseRTMLocking

  • -XX:+SegmentedCodeCache

    启用代码缓存的分段。

    若没有启用该选项,代码缓存由一个大段组成。

    若启用了该选项,会为nonmethod, profiled method, nonprofiled method code 细分段。该段不会在运行时调整大小。

    若启用分层编译以及-XX:ReservedCodeCacheSize >= 240MB,则该选项默认被启用。

    优点是可以更好的控制内存空间,减少内存碎片以及由于改进了局部性而具有更好的iTLB/iCache行为。

    iTLB / iCache是特定于CPU的术语,表示指令转换后备缓冲区(ITLB)。ICache是CPU中的指令缓存。可以在以下文件中找到代码缓存的实现:/share/vm/code/codeCache.cpp

  • -XX:StartAggressiveSweepingAt=percent

    当仅给定百分比的代码缓存可用时,强制对活动方法进行堆栈扫描以主动删除未使用的代码。默认值为10%。

  • -XX:-TieredCompilation

    禁用分层编译。默认情况下,启用此选项。仅Java HotSpot Server VM支持此选项。

  • -XX:+UseAES

    为Intel/AMD/SPARC 硬件启用硬件级别的AES函数。支持的硬件包括:

    • Intel Westmere (2010及以上)
    • AMD Bulldozer(2011及以上)
    • SPARC (T4及以上)

    该选项需要与UseAESIntrinsics结合使用,现在必须启用-XX:+UnlockDiagnosticVMOptions。

  • -XX:+UseAESIntrinsics

    默认启用 -XX:+UseAES-XX:+UseAESIntrinsics ,启用硬件级别的AES需要指定:

    -XX:+UseAES -XX:+UseAESIntrinsics

    仅在ServerVM支持,ClientVM不支持。

  • -XX:+UseCMoveUnconditionally:无论是否有利分析,都会生成CMove(标量和矢量)指令。

  • -XX:+UseCodeCacheFlushing

    在关闭编译器之前刷新高速缓存的代码。默认启用该选项。

  • -XX:+UseCondCardMark

    启用更新Card Table之前检测Card是否已被标记。默认禁用此选项,它应该用于multi-socket的机器上,可以提高依赖于禀告操作的Java应用程序性能。

    仅Java HotSpot Server VM支持此选项。

  • -XX:+UseCountedLoopSafepoints:将safe-point设置于计数循环中,默认禁用。

  • -XX:+UseFMA

    启用硬件(支持的硬件由Intel,SPARC,ARM64)级别的FMA函数。

    FMA函数是指Math.fma(a, b, c):a * b + c。

  • -XX:+UseRTMDeopt

    根据中止比率自动调整RTM锁定。比率由-XX:RTMAbortRatio指定,若中止事务超过了终止比率,那么包含该锁的方法将被优化,并将所有锁作为普通锁重新编译。默认禁用该选项。

    -XX:+UseRTMLocking必须先启用-XX:+UseRTMDeopt。

  • -XX:+UseRTMLocking

    使用常规锁定机制作为后备处理程序,为所有膨胀锁生成受限事务存储(RTM)锁定代码。默认情况下禁用此选项。与RTM相关的选项仅可用于支持事务性同步扩展(TSX)的x86 CPU上的Java HotSpot Server VM。

    RTM是Intel TSX的一部分,TSX是x86指令集扩展,有助于创建多线程应用程序。RTM引入了新的指示XBEGINXABORTXEND,和XTEST。该XBEGINXEND说明附上一组指令作为一个事务中运行。如果在运行事务时未发现冲突,那么将在XEND指令中一起提交对存储器和寄存器的修改。该XABORT指令可用于显式中止事务,并且该XEND指令检查事务中是否正在运行一组指令。

    当另一个线程尝试访问同一事务时,对事务的锁定会被夸大,从而阻塞了最初不请求访问该事务的线程。RTM要求指定一组备用操作,以防事务中止或失败。RTM锁是已委派给TSX系统的锁。

    RTM提高了关键区域(冲突代码不能被多个线程同时访问)中冲突少的高竞争性锁的性能。RTM还提高了粗粒度锁定的性能,这种性能通常在多线程应用程序中表现不佳。(粗粒度锁定是长时间保持锁的策略,以最大程度地减少获取和释放锁的开销,而细粒度锁定是通过仅在必要时锁定并尽快解锁来尝试实现最大并行度的策略。 )此外,对于不同线程使用的竞争激烈的锁,RTM可以减少错误的缓存行共享,也称为缓存行乒乓。当来自不同处理器的多个线程正在访问不同资源时,会发生这种情况,但是资源共享相同的缓存行。结果,处理器反复使其他处理器的缓存行无效,这迫使它们从主内存而不是其缓存中读取。

  • -XX:+UseSHA

    启用SPRAC硬件级别的SHA1哈希函数。该选项与UseSHA1Intrinsics, UseSHA256Intrinsics, UseSHA512Intrinsics 配合使用。

    默认启用UseSHA与 UseSHA*Intrinsics选项 ,并且仅适用于 SPARC T4 和 新的Java Hotspot ServerVM 64bit。

    该选项仅作用于sun.security.provider.Sun提供的SHA操作。

  • -XX:+UseSHA [1/256/512] Intrinsics

    启用 SHA-* 哈希加密函数,需要开启-XX:+UnlockDiagnosticVMOptions。

  • -XX:+UseSuperWord

    允许将标量运算转为超字运算。超字是矢量化优化。

    默认启用该选项,仅Java HotSpot Server VM支持此选项。

Java 高级可维护选项

  • -XX:+DisableAttachMechanism

    禁止工具链接到 JVM的机制,默认被禁用,意味着可以使用诊断和故障排除工具链接到 JVM,如jcmd,jinfo,jmap,jstack之类的工具。

  • -XX:+ExtendedDTraceProbes

    **Oracle Solaris,Linux和macOS:**启用dtrace影响性能的其他工具探测。默认情况下,此选项是禁用的,并且dtrace仅执行标准探测。

  • -XX:+HeapDumpOnOutOfMemoryError

    抛出java.lang.OutOfMemoryError时,使用HPROF 将Java堆dump到当前目录的一个文件中。默认该选项是禁用的。

  • -XX:HeapDumpPath=path

    抛出java.lang.OutOfMemoryError时,使用 HPROF 将 Java 堆 dump到指定的文件中。默认是在当前目录创建,文件名格式为:java_pid<pid>.hprof<pid> 是 抛出异常的进程ID。或者可以指定为其他文件:

    -XX:HeapDumpPath=./java_pid%p.hprof

    • Oracle Solaris,Linux和macOS:-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof

    • Windows: -XX:HeapDumpPath=C:/log/java/java_heapdump.log

  • -XX:LogFile=path

    默认日志文件在当前目录创建名为hotspot.log的文件。

    • Oracle Solaris,Linux和macOS: -XX:LogFile=/var/log/java/hotspot.log
    • Windows: -XX:LogFile=C:/log/java/hotspot.log
  • -XX:+PrintClassHistogram

    启用该选项后,App遇到以下事件会打印类实例的直方图:

    • Oracle Solaris, Linux, and macOS: Control+Break
    • Windows: Control+C (SIGTERM)

    默认禁用该选项。

    该选项等效于jmap -histo或者jcmd [pid] GC.class_histogram。

  • -XX:+PrintConcurrentLocks

    启用该选项后,App遇到以下事件会打印JUC的锁:

    • Oracle Solaris, Linux, and macOS: Control+Break
    • Windows: Control+C (SIGTERM)

    默认禁用该选项。

    该选项等效于jstack -l 或 jcmd [pid] Thread.print -l。

  • -XX:+PrintFlagsRanges

    打印指定范围并允许自动测试值,详见:Validate Java Virtual Machine Flag Arguments

  • -XX:+PerfDataSaveToFile

    若启用该选项,则在JavaAPP退出时保存jstat二进制数据。该文件名为 hsperfdata_pid

    使用jstat命令来显示此文件包含的性能数据:

    jstat -class file:///path/hsperfdata_pid

    jstat -gc file:///path/hsperfdata_pid

  • -XX:+UsePerfData

    启用 perfdata 功能。默认启用该选项来允许 JVM 监视和性能测试。

    若该选项被禁用,会抑制 hsperfdata_userid 目录的创建。

Java的GC 选项参数

  • -XX:+AggressiveHeap

    启用Java堆优化。将各种参数设置为最适合长时间运行并且需要大量内存分配的值。默认禁用该选项。

  • -XX:+AlwaysPreTouch

    从操作系统请求VM之后,将内存分发到应用程序之前,请求VM摸底Java堆的每个页面。

    默认禁用该选项,应用程序使用堆空间时将提交所有页面。

  • -XX:+CMSClassUnloadingEnabled

    使用CMS垃圾收集器时,启用类卸载。默认启用该选项。

  • -XX:CMSExpAvgFactor=percent

    设置在计算并发收集统计信息的指数平均值用于加权当前样本的时间百分比。默认指数平均系数为25%。

    -XX:CMSExpAvgFactor=15(设置为15)

  • -XX:CMSInitiatingOccupancyFraction=percent

    设置开始CMS收集周期的老年代占用百分比。默认为-1,负值意味着该选项用于定义初始占用率的值。

  • -XX:CMSIncrementalDutySafetyFactor=percent

    设置当计算占空比时用于增加保守性的百分比。默认为10。

  • -XX:+CMSScavengeBeforeRemark

    在CMS的重新标记(remark)步骤之前启用清除尝试。默认禁用该选项。

  • -XX:CMSTriggerRatio=percent

    设置在CMS收集周期开始之前,-XX:MinHeapFreeRatio选项分配的百分比。默认为80。

  • -XX:ConcGCThreads=threads

    设置用于并发GC的线程数。threads大约是Parallel GC线程数的1/4。默认取决于 JVM 可用的CPU数量。

  • -XX:+DisableExplicitGC

    启用禁止System.gc调用的处理。默认禁用该选项,意味着 JVM 会在必要时对 System.gc 进行处理。

  • -XX:+ExplicitGCInvokesConcurrent

    通过System.gc 启用并发GC。默认禁用该选项,并且只能与-XX:+UseConcMarkSweepGC(已过时) 和 -XX:+UseG1GC 一起使用。

  • -XX:G1AdaptiveIHOPNumInitialSamples=number

    -XX:UseAdaptiveIHOP 被启用,设置用于收集样品直到 G1 自适应确定

    -XX:InitiatingHeapOccupancyPercent 的最佳值之前的完整标记周期数。

    以前,G1 使用 -XX:InitiatingHeapOccupancyPercent 达到此目的。

    该选项默认为3。

  • -XX:G1HeapRegionSize=size

    设置 G1 收集器 的region大小。该值必须是2的幂次方,范围是1MB到32MB。默认会根据堆大小计算,region数量大约是2048个。

  • -XX:G1HeapWastePercent=percent

    设置可以浪费的堆百分比。当可回收百分比小于该选项时,Java HotspotVM不会启用混合GC周期。

    默认为5%。

  • -XX:G1MaxNewSizePercent=percent

    设置堆的百分比以作为年轻代的最大容量。默认值为60%。

    该选项是一个实验性标志,该选项可替换 -XX:DefaultMaxNewGenPercent

  • -XX:G1MixedGCCountTarget=number

    设置标记周期后的混合GC的目标次数,收集至多有 G1MixedGCLIveThresholdPercent 存活数据的老年代region。默认值为8次混合GC。混合GC的总数在此目标数量之内。

  • -XX:G1MixedGCLiveThresholdPercent=percent

    设置包含在混合GC周期中的old region占用阈值。默认是85%。

    这是一个实验选项,替换了 -XX:G1OldCSetRegionLiveThresholdPercent

  • -XX:G1NewSizePercent=percent

    设置堆的百分比来作为年轻代的最小值。默认为5%。

  • -XX:G1OldCSetRegionThresholdPercent=percent

    设置在混合GC周期时old regions数量的上限。默认为10%。

  • -XX:G1ReservePercent=percent

    设置一个堆的百分比,这部分堆被保留用来减少 G1 收集器升级失败的可能性。当增加或减少该百分比时,确保该值是Java堆总数相同。默认为10%。

  • -XX:+G1UseAdaptiveIHOP

    控制老年代占用的自适应计算 去 为 老年代收集的后台工作 做准备。若启用该选项, G1 使用 -XX:G1AdaptiveIHOPNumInitialSamples 的值指定 -XX:InitiatingHeapOccupancyPercent 前几次的值,然后自适应计算初始占用的最佳值,否则老年代收集过程始终使用 -XX:InitiatingHeapOccupancyPercent 参数指定的老年代占比。

  • -XX:InitialHeapSize=size

    设置内存分配池的初始容量。该值必须为0,或者是1024的倍数且大于1MB,支持k/K/m/M/g/G 单位。

    默认值基于系统配置选择。

    若将此选项设置为0,则将初始容量设置为年轻代和老年代之和。可以用-XX:NewSize设置年轻代的堆大小。

  • -XX:InitialRAMPercentage=percent

    JVM 在应用工程学试探之前,将使用JAVA堆的初始容量设置为-XX:MaxRAM选项指定的最大内存量的百分比。默认为1.5625%。

  • -XX:InitialSurvivorRatio=ratio

    设置吞吐量垃圾收集器(通过 -XX:+UseParallelGC-XX:+UseParallelOldGC 单独或一起启用)使用的初始survivor空间比率。通过 -XX:+UseParallelGC-XX:+UseParallelOldGC 启用的吞吐量垃圾收集器默认启用自适应调整大小,survicor空间从初始值根据应用行为被自适应调整。若自适应调整被禁用(通过-XX:-UseAdaptiveSizePolicy),-XX:SurvivorRatio 选项被用来指定应用执行期间的survicor空间。

    可以通过年轻代大小(Y)和初始survicor空间比率(R) 计算 初始survivor空间(S):

    S = Y / (R + 2)

    等式中的2代表2个survivor空间,意味着R越大S越小。

    默认R为8,若Y初始为2MB,S为0.2MB。

  • -XX:InitiatingHeapOccupancyPercent=percent

    设置G1垃圾收集器前几次并发标记周期的老年代占比。

    默认初始值为45%。值0代表 从开始到G1收集器自适应设置该值 之前 不间断并发 GC 周期。

    可以参阅 -XX:G1UseAdaptiveIHOP-XX:G1AdaptiveIHOPNumInitialSamples 选项。

  • -XX:MaxGCPauseMillis=time

    设置GC的最大暂停时间,当然这是一个目标,JVM会努力达到,默认情况下,G1的最大暂停时间是200ms,其他代的收集器不使用该暂停时间目标。

  • -XX:MaxHeapSize=size

    设置内存分配池的最大容量。该值必须是1024的倍数且大于2MB,支持k/K/m/M/g/G 单位。

    默认值基于系统配置选择。

    对于服务器,-XX:InitialHeapSize-XX:MaxHeapSize 通常设置为相同的值。

    该值等效于-Xmx。

  • -XX:MinHeapSize=size

    设置内存分配池的最低容量。该值必须是0 或者1024的倍数且大于1MB,支持k/K/m/M/g/G 单位。

  • -XX:MaxHeapFreeRatio=percent

    设置GC之后堆的最大可用比例。若可用堆空间大于该值,堆将收缩。

    默认该值为70%。

    通过命令行参数 降低 -XX:MaxHeapFreeRatio 选项 -XX:MinHeapFreeRatio 可以最小化堆容量,通过尝试找到 不影响应用程序性能 的 最小堆 的参数值。

    尝试让堆保持小容量应该添加 -XX:-ShrinkHeapInSteps 参数。参见 性能调整示例

  • -XX:MinHeapFreeRatio=percent

    设置GC之后堆的最小可用比例。若可用堆空间小于该值,堆将扩容。

    默认该值为40%。

  • -XX:MaxMetaspaceSize=size

    设置分配给Metaspace的native内存的最大值。默认情况下大小不受限制。

  • -XX:MaxNewSize=size

    设置年轻代的最大容量。The default value is set ergonomically.

  • -XX:MaxRAM=size

    JVM 在应用工程学试探之前,将使用JAVA堆的最大内存量。默认值为JVM进程可用的最大内存,最大128GB。

    JVM进程可用的最大内存是值机器物理内存和环境(如Docker)设置任何约束条件的最小值。

    若该选项与其他选项组合结果的最大内存量大于压缩oop的寻址范围,可以指定-XX:UseCompressedOops关闭压缩指针。

  • -XX:MaxRAMPercentage=percent

    JVM 在应用工程学试探之前,JVM可能使用-XX:MaxRAM指定的最大内存量来计算百分比。默认为25%。

    若该选项与其他选项组合结果的最大内存量大于压缩oop的寻址范围,可以指定-XX:UseCompressedOops关闭压缩指针。

  • -XX:MinRAMPercentage=percent

    JVM 在应用工程学试探之前,JVM可能使用-XX:MaxRAM指定的最大内存量来计算百分比。默认为25%。

    一个小堆大约是125MB。

    默认是50%。

  • -XX:MaxTenuringThreshold=threshold

    设置自适应GC大小的最大年龄阈值。最大值为15,Parallel (吞吐量)GC的默认值为15,CMS收集器的默认值是6。

  • -XX:MetaspaceSize=size

    设置分配class metaspace 的容量,首次超过该容量触发GC。GC的阈值依赖与metaspace的使用而增加或减少。默认值依赖于平台。

  • -XX:NewRatio=ratio

    设置年轻代和老年代的比例,默认值为2。

  • -XX:NewSize=size

    设置年轻代的初始容量,支持k/K/m/M/g/G 单位。

    建议将年轻代的大小设置为堆的25%到50%之间。

    该选项等效于-Xmn。

  • -XX:ParallelGCThreads=threads

    设置 STW(stop-the-world)的工作线程数。默认取决于JVM 和 可用的CPU数。

    例如,要将G1的GC线程数设置为2:-XX:ParallelGCThreads=2

  • -XX:+ParallelRefProcEnabled:启用并行处理引用。默认被禁用。

  • -XX:+PrintAdaptiveSizePolicy:打印自适应代尺寸的信息。默认被禁用。

  • -XX:+ScavengeBeforeFullGC

    每次full GC 之前先进行年轻代GC。默认启用该选项,并建议不要禁用该选项,因为full GC之前进行年轻代GC可以减少老年代到年轻代的可访问对象数量。

  • -XX:SoftRefLRUPolicyMSPerMB=time

    设置最后一次被引用之后,soft reference的存活时长,单位是毫秒。默认是堆每个空闲MB字节声明周期的一秒钟。

    对于Java HotSpot ClientVM是当前堆大小,Java HotSpotServerVM是堆的上限容量,这种差异意味着,ClienVM倾向于刷新soft references,而不是扩展堆。

    若是JavaHotSpotServerVM,-Xmx选项对于soft reference被GC的速度有很大影响。

  • -XX:-ShrinkHeapInSteps

    将Java堆逐渐减少到 -XX:MaxHeapFreeRatio 指定的目标大小。默认启用该选项。

    若禁用该选项,它会立即将Java堆减少到目标大小而不需要经过多个GC周期。若要最小化堆大小,请禁用该选项。

  • -XX:StringDeduplicationAgeThreshold=threshold

    String对象达到指定年龄阈值将被视为去重候选。对象年龄代表经过N次GC依然存活,那么年龄即是N。

    默认值为3。

  • -XX:SurvivorRatio=ratio

    年轻代中的eden和survivor的比率。默认为8。

  • -XX:TargetSurvivorRatio=percent

    设置年轻代GC之后想要的survivor空间比率。默认50%。

  • -XX:TLABSize=size

    设置 TLAB (thread-local allocation buffer)的初始容量,支持k/K/m/M/g/G 单位。

    若设置为0,则JVM会自动选择初始大小。

  • -XX:+UseAdaptiveSizePolicy

    启用自适应大小,默认启用该选项。

    要想禁用该功能,需要禁用该选项和设置内存分配池的大小,参考 -XX:SurvivorRatio

    相关:https://www.jianshu.com/pa/7414fd6862c5

  • -XX:+UseCMSInitiatingOccupancyOnly

    将占用值作为初始CMS收集器的唯一条件。默认被禁用并且可能使用其他条件初始CMS收集器。

  • -XX:+UseG1GC

    启用G1垃圾收集器。G1适用于服务器,适用于RAM较大处理器较多的机器。

  • -XX:+UseGCOverheadLimit

    抛出 OutOfMemoryError 异常之前限制JVM在GC上花费的时间比例。默认启用该选项。

    若GC花费了98%的时间,但是堆回收小于2%将会抛出 ParallelGC OOM。当堆很小时,此功能可用于防止应用程序长时间运行但是没有进展。

  • -XX:+UseNUMA

    在NUMA架构上,通过应用程序使用低延时内存来优化性能。默认禁用该选项,意味着不对NUMA进行优化,该选项仅在使用 Parallel GC (-XX:+UseParallelGC)时可用。

  • -XX:+UseParallelGC

    启用并行(吞吐量)收集器,利用多处理器提高性能。

    默认禁用该选项,且使用默认的GC收集器。若启用该选项,默认会启用 -XX:+UseParallelOldGC ,除非显示禁用-XX:+UseParallelOldGC

  • -XX:+UseParallelOldGC

    启用用于full GC 的 并行垃圾收集器。默认被禁用。当-XX:+UseParallelGC被启用,本选项也会自动启用。

  • -XX:+UseSerialGC

    启用串行垃圾收集器,对于small和simple并且不需要特殊功能GC的应用程序,这个选项是最佳选择。

    默认禁用该选项。

  • -XX:+UseSHM

    让JVM使用共享内存来设置large pages。详见 Large Pages

  • -XX:+UseStringDeduplication

    启用字符串去重。默认禁用该选项,要使用该选项,必须启用G1收集器。

  • -XX:+UseTLAB

    允许在年轻代空间使用 TLAB。默认启用该选项。

  • -XX:+UseZGC

    启用ZGC收集器,该收集器最适合以一定吞吐量为成本为大型 JAVA 堆提供最低的延时。

    这是一个实验性命令,启用该选项之前需要启用 -XX:+UnlockExperimentalVMOptions 。例如:

    -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

分析代码堆状态

未完待续


javap

javap [options] classes...

classes

[options]

-help --help -?

打印javap的帮助信息。

-version

打印发行信息。

-verbose -v

打印有关所选类的其他信息。

-l

打印行和局部变量表。

-public

仅展示public classes / members

-protected

仅展示public/protected classes / members

-package

仅展示public/protected/package classes / members

-private -p

展示所有class和member

-c

打印类中每个方法的反汇编代码,例如,包含java字节码指令。

-s

打印内部类型签名

-sysinfo

展示正在执行的类系统信息(path,size,data,SHA-256 hash)

-constants

打印 static final 常量。

--module(-m) module

反汇编指定module里的类。

--module-path path

指定寻找应用module的路径

--system jdk

指定寻找系统module的路径

--class-path path, -classpath path, -cp path

指定javap命令用来寻找用户类文件的classpath路径,默认是CLASSPTH环境变量。

-bootclasspath path

复写根加载器路径

--multi-release version

在多版本的JAR包中选择指定版本

-Joption

将指定的选项传递给JVM。例如:

javap -J-version

javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName

可参考java命令中的选项列表。

javap例子

编译以下文件 HelloWorldFrame.java

代码
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class HelloWorldFrame extends JFrame {

   String message = "Hello World!";

   public HelloWorldFrame(){
        setContentPane(new JPanel(){
            @Override
            protected void paintComponent(Graphics g) {
                g.drawString(message, 15, 30);
            }
        });
        setSize(100, 100);
    }
    public static void main(String[] args) {
        HelloWorldFrame frame = new HelloWorldFrame();
        frame.setVisible(true);

    }

}

运行 javap HelloWorldFrame.class ,输出

代码
Compiled from "HelloWorldFrame.java"
public class HelloWorldFrame extends javax.swing.JFrame {
  java.lang.String message;
  public HelloWorldFrame();
  public static void main(java.lang.String[]);
}

运行 javap -c HelloWorldFrame.class,输出

代码
Compiled from "HelloJaotc.java"
public class HelloJaotc {
  public HelloJaotc();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: aload_0
       1: astore_1
       2: aload_1
       3: arraylength
       4: istore_2
       5: iconst_0
       6: istore_3
       7: iload_3
       8: iload_2
       9: if_icmpge     31
      12: aload_1
      13: iload_3
      14: aaload
      15: astore        4
      17: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
      20: aload         4
      22: invokevirtual #13                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      25: iinc          3, 1
      28: goto          7
      31: iconst_2
      32: iconst_5
      33: invokestatic  #19                 // Method add:(II)I
      36: istore_1
      37: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
      40: iload_1
      41: invokevirtual #25                 // Method java/io/PrintStream.println:(I)V
      44: return
}

C:\Users\Administrator\OneDrive\articles\Java-bin>javap -c HelloWorldFrame.class
Compiled from "HelloWorldFrame.java"
public class HelloWorldFrame extends javax.swing.JFrame {
  java.lang.String message;

  public HelloWorldFrame();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method javax/swing/JFrame."<init>":()V
       4: aload_0
       5: ldc           #7                  // String Hello World!
       7: putfield      #9                  // Field message:Ljava/lang/String;
      10: aload_0
      11: new           #15                 // class HelloWorldFrame$1
      14: dup
      15: aload_0
      16: invokespecial #17                 // Method HelloWorldFrame$1."<init>":(LHelloWorldFrame;)V
      19: invokevirtual #20                 // Method setContentPane:(Ljava/awt/Container;)V
      22: aload_0
      23: bipush        100
      25: bipush        100
      27: invokevirtual #24                 // Method setSize:(II)V
      30: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #10                 // class HelloWorldFrame
       3: dup
       4: invokespecial #28                 // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: iconst_1
      10: invokevirtual #29                 // Method setVisible:(Z)V
      13: return
}

jdb

官方文档:https://docs.oracle.com/en/java/javase/13/docs/specs/man/jdb.html

jdb - 查找和修复java平台程序。

命令格式

jdb [options] [classname] [arguments]

描述

jdb 是一个针对class的简单的命令行调试工具。

-help

打印jdb的帮助信息

-sourcepath dir1 :dir2: ...

在指定路径中搜索源码,若未启用该选项,则使用(.)作为默认路径。

-attach address

使用默认的链接机制附加调试器到运行中的JVM。

-listen address

等待运行中的JVM使用标准连接器链接到指定地址。

-listenany

等待运行中的JVM使用标准连接器连接到任意地址。

-launch

jdb命令启动之后立刻开始调试程序。这个选项消除了对 run 命令的需要。调试程序将被启动并在初始应用类加载之前停止。此时,你可以设置断点,然后用cont命令继续执行。

-listconnectors

列出 JVM 中可用的连接器列表

-connect connector-name:name1=value1....

使用指定连接器和参数列表链接到目标JVM

-dbgtrace [flags]

打印jdb命令的调试信息。

-tclient

以ClientVM执行

-tserver

以ServerVM执行

-Joption

将option选项传递给JVM,可参考java的选项列表,javap的使用例子。

-v -verbose[:class|gc|jni]

开启详细模式

-Dname=value

设置系统属性

-classpath dir

用冒号分割的classpath列表,用于搜索类。

-X option

非标准目标JVM

jinfo

官方文档:https://docs.oracle.com/en/java/javase/13/docs/specs/man/jinfo.html

生成指定java进程得配置信息

jinfo [option] pid

pid可用jps查看,docker之中的进程需要单独处理。

-flag name

打印指定命令行标志的名称和值

-flag [+|-]name

启用或禁用指定布尔型的命令行标志

-flag name=value

设置命令行标志参数。

-flags

打印传递给JVM的标志列表

-sysprops

打印系统属性列表

-h -help

打印帮助信息

例子

jinfo

jmap

官方文档:https://docs.oracle.com/en/java/javase/13/docs/specs/man/jmap.html

jmap显示指定进程的详细信息。

注意:在没有dbgeng.dll的windows系统上,必须安装windows调试工具才能使用这些工具。

jmap [options] pid

-clstats pid

链接到运行在的 JAVA 进程,然后打印 Java堆的 类加载器统计信息。

-finalizerinfo pid

链接到运行在的 JAVA 进程,然后打印正在等待对象完成的信息。

-histo[:live] pid

链接到运行在的 JAVA 进程,打印java对象堆的直方图。若指定live选项,仅计算活对象。

-dump:dump_options pid

链接到运行在的 JAVA 进程,然后dump JAVA堆,dump_options 有以下选项:

  • live:仅dump活对象

  • format=b:以 hprof 二进制格式dump JAVA 堆

  • file=filename:dump Java 堆 到文件。

例如:jmap -dump:live,format=b,file=heap.bin pid

例子

jmap

jstack

官方文档:https://docs.oracle.com/en/java/javase/13/docs/specs/man/jstack.html

jstack打印java进程中线程的堆栈跟踪

注意:在没有dbgeng.dll的windows系统上,必须安装windows调试工具才能使用这些工具。

jstack [options] pid

-l

打印关于锁信息的长列表

-e

打印关于线程的附加信息

-h -help

打印帮助信息

例子

jstack

jjs

官方文档:https://docs.oracle.com/en/java/javase/14/docs/specs/man/jjs.html

待写....

jrunscript