尽管 OpenJ9 实现了自己的命令行界面,但 VM 会识别并接受许多热点选项以实现兼容性。默认情况下,VM 无法识别的任何选项都将被忽略,从而防止应用程序无法启动。您可以使用: -XX:-IgnoreUnrecognizedXXColonOptions关闭此行为
OpenJ9 兼容 HotSpot 的以下参数,可不做任何变更直接在 OpenJ9 上使用。
Option | Usage |
显示有关非标准选项的帮助。 | |
指定引导类和资源的搜索路径。 | |
在 VM 启动期间运行对 JNI 函数的其他检查。 | |
启用严格的类文件格式检查。 | |
在仅解释模式下运行应用程序。 | |
启用垃圾回收日志记录的某些形式将被识别。 | |
设置 -Xgcpolicy:gencon 时新区域的初始大小和最大大小。 | |
设置堆的初始大小。 | |
指定对象内存分配池的最大大小。 | |
禁用类垃圾回收 (GC)。 | |
防止 OpenJ9 运行时环境处理信号。 | |
设置 Java线程堆栈大小。 | |
启用或禁用验证程序。 | |
配置 GC 突变器后台线程的数量。 | |
在初始堆膨胀或堆扩展期间启用/禁用内存提交。 | |
启用/禁用压缩。 | |
jdk16+ | 为基于值的类配置警告。 |
启用/禁用显式调用。 | |
在内存不足时触发 VM 关闭。 | |
启用/禁用内存不足情况下的转储。 | |
指定所有 VM 转储(包括堆转储、javacore 和系统转储)的目录。 | |
指定是否忽略无法识别的顶级 VM 选项。 | |
设置堆的初始大小。 | |
将 Java 堆的初始大小设置为占总内存的百分比。 | |
设置可为所有直接字节缓冲区保留的内存量限制。 | |
将 Java 堆的最大大小设置为占总内存的百分比。 | |
在引发 时运行指定的命令。 | |
指定对象内存分配池的最大大小。 | |
将 Java 堆的最大大小设置为占总内存的百分比。 | |
在引发 时运行指定的命令。 | |
配置 GC 突变器后台线程的数量。 | |
配置 GC 线程数。 | |
在应用程序退出时打印代码缓存使用情况。 | |
指定是否在堆栈跟踪中显示生成的隐藏帧。 | |
禁用 64 位 JVM 中的压缩引用 | |
当 VM 检测到 Java 堆在容器中运行时,将较大的内存比例设置为 Java 堆。 |
HotSpot Option | OpenJ9 Option | Usage |
-Xcomp | 禁用解释性方法调用 | |
-Xgc | 配置垃圾回收策略 | |
-XX:+UseNUMA | 控制非一致性内存结构感知 |
jcmd [<options>] [<vmid> <arguments>]
options | Hotspot | OpenJ9 | 注释 |
-J | √ | √ | 为运行命令的 Java 虚拟机提供参数 |
-h | √ | √ | 打印帮助 |
-f | √ | × | 从文件中读取并执行命令 |
-l | √ | √ | 列出本机jvm进程 |
arguments | 注释 |
Dump.heap | 创建堆转储文件 |
Dump.java | 创建一个javacore文件 |
Dump.snap | 转储跟踪缓冲区的快照。 |
Dump.system | 创建一个系统转储文件 |
GC.class_histogram | 获取java进程的堆信息 |
GC.heap_dump | 创建堆转储文件 |
GC.run | 运行垃圾收集器 |
Thread.print | 展示线程信息 |
jstat.class | 展示JVM类加载器数据 |
例如:
$ jcmd -l
3112 openj9.tools.attach.diagnostics.tools.Jcmd -l
3924 com.zhongan.platform.demo.PerformanceClientApplication
$ jcmd 3924 help
Dump.heap
Dump.java
Dump.snap
Dump.system
GC.class_histogram
GC.heap_dump
GC.run
Thread.print
help
jstat.class
jmap [<option>] [<vmid>]
options | Hotspot | OpenJ9 | 注释 |
-histo | √ | √ | 打印有关堆上类的统计信息,包括对象数及其聚合大小 |
-histo:live | √ | √ | 仅打印活动对象的统计信息 |
-J | √ | √ | 为运行命令的 Java 虚拟机提供参数 |
-dump | √ | × | 生成堆转储快照 |
-finalizerinfo | √ | × | 显示在等待Finalizer线程执行finalizer方法的对象 |
-heap | √ | × | 显示Java堆详细信息 |
-F | √ | × | 当-dump没有响应时,强制生成dump快照 |
例如:
$ jmap -histo:live 17592
num object count total size class name
-------------------------------------------------
1 52999 2119960 [C
2 2953 1559184 [S
3 12888 1134144 java.lang.reflect.Method
4 10777 1034592 java.lang.Class
5 39194 940656 java.util.concurrent.ConcurrentHashMap$Node
6 55649 890384 java.lang.String
7 9541 763280 [Ljava.util.HashMap$Node;
8 16871 674840 java.lang.Class$ReflectRef
9 18965 606880 java.util.LinkedHashMap$Entry
...
jps [<options>]
options | Hotspot | OpenJ9 | 注释 |
-l | √ | √ | 打印应用程序包名称 |
-q | √ | √ | 不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。 |
-m | √ | √ | 显示Java虚拟机启动时传递给main()方法的参数。 |
-v | √ | √ | 显示Java虚拟机启动时传递的JVM参数。 |
-V | √ | × | 不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。 |
-J | √ | √ | 为运行命令的 Java 虚拟机提供参数 |
例如:
$ jps -l
5462 org.foo.bar.MyApplication
14332 openj9.tools.attach.diagnostics.Jps
$ jps -q
5462
14332
jstat [<option>] [<vmid>]
options | Hotspot | OpenJ9 | 注释 |
-class | √ | √ | 显示类加载统计信息 |
-compiler | √ | × | HotSpt JIT编译器行为统计 |
-gc | √ | × | 垃圾回收堆的行为统计 |
-gccapacity | √ | × | 各个垃圾回收代容量和他们相应的空间统计 |
-gcutil | √ | × | 垃圾回收统计概述 |
-gccause | √ | × | 垃圾收集统计概述,附加最近两次垃圾回收事件的原因 |
-gcnew | √ | × | 新生代行为统计 |
-gcnewcapacity | √ | × | 新生代与其相应的内存空间的统计 |
-gcold | √ | × | 年老代和永生代行为统计 |
-gcoldcapacity | √ | × | 年老代行为统计 |
-gcpermcapacity | √ | × | 永生代行为统计 |
例如
$ jstat -class 17592
Class Loaded Class Unloaded
10800 4
jstack <options>* <pid>*
options | Hotspot | OpenJ9 | 注释 |
-F | √ | × | 当正常输出请求不被响应时,强制输出线程堆栈 |
-l | √ | √ | 打印更详细的输出,包括有关锁的信息 |
-m | √ | × | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
-p | × | √ | 打印进程的系统和代理属性 |
-h | √ | √ | 打印帮助信息 |
-J | × | √ | 为运行命令的 Java 虚拟机提供参数 |
例如
$ jstack -p 17592
2023-02-28T10:58:08.875
Virtual machine: 17592 JVM information:
JRE 1.8.0 Windows 10 amd64-64-Bit Compressed References 20230207_599 (JIT enabled, AOT enabled)
OpenJ9 - e68fb241f
OMR - f491bbf6f
JCL - eebde685ec based on jdk8u362-b09
"JIT Compilation Thread-000" Id=4 RUNNABLE
"JIT Compilation Thread-001" Id=5 RUNNABLE
"JIT Compilation Thread-002 Suspended" Id=6 RUNNABLE
"JIT Compilation Thread-003 Suspended" Id=7 RUNNABLE
"JIT Compilation Thread-004 Suspended" Id=8 RUNNABLE
"JIT Compilation Thread-005 Suspended" Id=9 RUNNABLE
"JIT Compilation Thread-006 Suspended" Id=10 RUNNABLE
"JIT Diagnostic Compilation Thread-007 Suspended" Id=11 RUNNABLE
"JIT-SamplerThread" Id=12 TIMED_WAITING
"IProfiler" Id=13 RUNNABLE
"RMI TCP Accept-0" Id=3 RUNNABLE
at java.net.DualStackPlainSocketImpl.accept0(Native Method)
at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199)
- locked java.net.SocksSocketImpl@bd454f07
at java.net.ServerSocket.implAccept(ServerSocket.java:560)
at java.net.ServerSocket.accept(ServerSocket.java:528)
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:52)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:405)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:377)
at java.lang.Thread.run(Thread.java:826)
"Finalizer thread" Id=14 RUNNABLE
...
java.vm.name=Eclipse OpenJ9 VM
com.ibm.oti.shared.enabled=false
com.ibm.vm.bitmode=64
file.encoding=UTF-8
csp.sentinel.charset=UTF-8
csp.sentinel.flow.cold.factor=3
com.ibm.oti.configuration=scar
java.specification.version=1.8
intellij.debug.agent=true
Agent properties:
com.sun.management.jmxremote.localConnectorAddress=service:jmx:rmi://127.0.0.1/stub/rO0ABXN9AAAAAQAlamF2YXgubWFuYWdlbWVudC5yZW1vdGUucm1pLlJNSVNlcnZlcnhy
ABdqYXZhLmxhbmcucmVmbGVjdC5Qcm94eeEn2iDMEEPLAgABTAABaHQAJUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uSGFuZGxlcjt4cHNyAC1qYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN0
SW52b2NhdGlvbkhhbmRsZXIAAAAAAAAAAgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjE5Mi4xNjguNDQuMTA3AADE1JTwWTD2
VXzjOmidUwAAAYaVxf50gAEAeA==
sun.java.command=com.zhongan.platform.demo.PerformanceClientApplication
openj9默认策略gencon可以使用arthas。
openj9启用balanced策略时使用arthas有bug。