该命令启动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 ...]
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 -XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5
长选项参数的两种方式:--name=value 或 --name value。
-agentlib:libname[=options]
加载本地指定代理库,后边跟库名,用逗号(,)分割多个库。
-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文件路径,因此命令行可能会很长。
以下选项是HotSpot虚拟机的通用选项。
-Xbatch
禁用后台编译,默认情况下,JVM以后台任务编译方法,在后台编译完成之前,JVM会以解释器模式执行方法。该选项将方法编译作为前台任务执行,直到全部编译完成。该命令等效于:-XX:-BackgroundCompilation
。
-Xbootclasspath/a:directories|zip|JAR-files
指定目标列表,可以是目录/jar包/zip包,附加到默认根加载器路径的末尾。
-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
该参数可以拆分为两个参数:
-Xms size
设置对的初始和最小容量,该值必须是1024的倍数并且大于1MB。例如:
-Xms6291456 -Xms6144k -Xms6m
该参数可以拆分为两个参数:
若未设置此选项,默认将初始大小设置为年轻代和老年代之和。
-Xmx size
设置堆的最大容量,该值必须是1024的倍数并且大于1MB,等效于-XX:MaxHeapSize。例如:
-Xmx83886080 -Xmx81920k -Xmx80m
-Xnoclassgc
禁用类的垃圾收集。虽然节省了一些GC和APP的中断时长,但这选项可能会导致内存不足的异常。
-Xrs
减少 JVM 对操作系统信号的使用,即使 JVM 突然终止,ShutdownHook也可以有序的执行用户清除代码(例如关闭线程池,连接池)。
Oracle Solaris, Linux, and macOS:
Windows:
指定-Xrs有2个结果:
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可选值:
-XshowSettings:显示所有设置,然后继续执行。
-XshowSettings:category
显示设置信息并继续,category可选值有:
-Xss size
设置线程栈大小,默认值取决于平台:
此选项类似于-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
当运行时出现,可以通过该参数指定操作模式:
该选项将在未来版本删除。
-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种情况效果较好:
-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使用情况的模式。
-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
如果帧指针可用,外部性能分析工具(例如: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
-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。
仅在Java Hot Spot Server VM支持。
-XX:+BackgroundCompilation:启用后台编译,默认启用。禁用等效于-Xbatch。
-XX:CICompilerCount=threads:用于编译的编译器线程数。默认ServerVM为2,ClientVM为1.
-XX:CompileCommand=command,method[,option]
指定要对某个方法执行的command命令。
例如:
-XX:CompileCommand=exclude,java/lang/String.indexOf
-XX:CompileCommand=exclude,java.lang.String::indexOf
-XX:CompileCommand="exclude,java/lang/String.indexOf,(Ljava/lang/String;)I"
-XX:CompileCommand=exclude,*.indexOf
-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函数。支持的硬件包括:
该选项需要与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引入了新的指示XBEGIN
,XABORT
,XEND
,和XTEST
。该XBEGIN
和XEND
说明附上一组指令作为一个事务中运行。如果在运行事务时未发现冲突,那么将在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支持此选项。
-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的文件。
-XX:+PrintClassHistogram
启用该选项后,App遇到以下事件会打印类实例的直方图:
Control+Break
Control+C
(SIGTERM
)默认禁用该选项。
该选项等效于jmap -histo或者jcmd [pid] GC.class_histogram。
-XX:+PrintConcurrentLocks
启用该选项后,App遇到以下事件会打印JUC的锁:
Control+Break
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 目录的创建。
-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
。
-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 [options] classes...
path/to/MyClass.class
java.lang.Object
打印javap的帮助信息。
打印发行信息。
打印有关所选类的其他信息。
打印行和局部变量表。
仅展示public classes / members
仅展示public/protected classes / members
仅展示public/protected/package classes / members
展示所有class和member
打印类中每个方法的反汇编代码,例如,包含java字节码指令。
打印内部类型签名
展示正在执行的类系统信息(path,size,data,SHA-256 hash)
打印 static final 常量。
反汇编指定module里的类。
指定寻找应用module的路径
指定寻找系统module的路径
指定javap命令用来寻找用户类文件的classpath路径,默认是CLASSPTH环境变量。
复写根加载器路径
在多版本的JAR包中选择指定版本
将指定的选项传递给JVM。例如:
javap -J-version
javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName
可参考java命令中的选项列表。
编译以下文件 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
}
官方文档:https://docs.oracle.com/en/java/javase/13/docs/specs/man/jdb.html
jdb - 查找和修复java平台程序。
命令格式
jdb [options] [classname] [arguments]
描述
jdb 是一个针对class的简单的命令行调试工具。
打印jdb的帮助信息
在指定路径中搜索源码,若未启用该选项,则使用(.)作为默认路径。
使用默认的链接机制附加调试器到运行中的JVM。
等待运行中的JVM使用标准连接器链接到指定地址。
等待运行中的JVM使用标准连接器连接到任意地址。
jdb命令启动之后立刻开始调试程序。这个选项消除了对 run 命令的需要。调试程序将被启动并在初始应用类加载之前停止。此时,你可以设置断点,然后用cont命令继续执行。
列出 JVM 中可用的连接器列表
使用指定连接器和参数列表链接到目标JVM
打印jdb命令的调试信息。
以ClientVM执行
以ServerVM执行
将option选项传递给JVM,可参考java的选项列表,javap的使用例子。
开启详细模式
设置系统属性
用冒号分割的classpath列表,用于搜索类。
非标准目标JVM
官方文档:https://docs.oracle.com/en/java/javase/13/docs/specs/man/jinfo.html
生成指定java进程得配置信息
jinfo [option] pid
pid可用jps查看,docker之中的进程需要单独处理。
打印指定命令行标志的名称和值
启用或禁用指定布尔型的命令行标志
设置命令行标志参数。
打印传递给JVM的标志列表
打印系统属性列表
打印帮助信息
官方文档:https://docs.oracle.com/en/java/javase/13/docs/specs/man/jmap.html
jmap显示指定进程的详细信息。
注意:在没有dbgeng.dll的windows系统上,必须安装windows调试工具才能使用这些工具。
jmap [options] pid
链接到运行在的 JAVA 进程,然后打印 Java堆的 类加载器统计信息。
链接到运行在的 JAVA 进程,然后打印正在等待对象完成的信息。
链接到运行在的 JAVA 进程,打印java对象堆的直方图。若指定live选项,仅计算活对象。
链接到运行在的 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
官方文档:https://docs.oracle.com/en/java/javase/13/docs/specs/man/jstack.html
jstack打印java进程中线程的堆栈跟踪
注意:在没有dbgeng.dll的windows系统上,必须安装windows调试工具才能使用这些工具。
jstack [options] pid
打印关于锁信息的长列表
打印关于线程的附加信息
打印帮助信息
官方文档:https://docs.oracle.com/en/java/javase/14/docs/specs/man/jjs.html
待写....