jcmd

jcmd

  发送诊断命令请求到正在运行的Java虚拟机(JVM)。它必须和JVM运行在同一台机器上,并且与启动JVM用户具有相同的组权限。

  • 用法
    1. 列出当前所有运行的 java 进程:jcmd -l|<none>
    2. 列出当前运行的 java 进程可以执行的操作:jcmd PID help
jcmd 664 help
664:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
  1. 参数含义
命令描述
jcmd PID VM.uptime查看 JVM 的启动时长
jcmd PID GC.class_histogram查看 JVM 的类信息,这个可以查看每个类的实例数量和占用空间大小。
jcmd PID Thread.print查看 JVM 的Thread Dump
jcmd PID GC.heap_dump FILE_NAME查看 JVM 的Heap Dump,注意,如果只指定文件名,默认会生成在启动 JVM 的目录里。
jcmd PID VM.system_properties查看 JVM 的属性信息
jcmd PID VM.flags查看 JVM 的启动参数,注意,可以看到 -X 和 -XX 的参数信息
jcmd PID VM.command_line查看 JVM 的启动命令行
jcmd PID GC.run_finalization对 JVM 执行 java.lang.System.runFinalization(),尽量b别去调用这个对象的finalize方法。
jcmd PID GC.run对 JVM 执行 java.lang.System.gc(),告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的
jcmd PID PerfCounter.print查看 JVM 的性能
<think> 嗯,用户想了解NIMT和jcmd的详细信息。首先需要明确这两个缩写的全称和所属领域。用户提到的引用[2]中有关键词"NIMT",出现在AOT参数设置中,看起来和安卓开发相关。而jcmd没有直接出现在引用里,但根据常识应该是JDK工具。 从引用[2]的上下文看,NIMT出现在trampolines参数设置里,和nrgctx-trampolines并列。需要回忆安卓ART虚拟机的技术细节——trampolines是跳板代码,用于解决AOT编译时的调用重定向问题。当APP出现不明闪退时,增大这个值可能是为了预留更多跳转空间。 关于jcmd,这是JDK自带的诊断工具。用户可能在做性能优化或故障排查。需要解释它的核心功能:获取JVM运行时信息、执行诊断命令、控制Java Flight Recorder。常见的用法包括列出Java进程、打印线程栈、导出堆转储等。 用户可能遇到的具体场景包括:安卓APP闪退(需要调整NIMT参数)、Java应用性能问题(使用jcmd分析)。在回答时要区分移动开发和服务器端开发的不同应用环境。 考虑到引用[3]提到"涌现能力",虽然和当前问题无关,但暗示用户对技术原理感兴趣,所以解释部分需要包含底层机制说明,比如解释ART虚拟机为何需要trampolines,JVM的Attach机制如何实现jcmd的动态注入等。 最后生成的问题要覆盖:参数调优实践(如确定NIMT合理值)、jcmd高级用法(JFR控制)、相关工具对比(如jcmd vs jstack)等实际需求。 </think> 以下基于公开技术资料对NIMT和jcmd的详细介绍: ### **一、NIMT(Native Invocation Method Trampolines)** 1. **核心作用** 在Android运行时(ART)中,NIMT是处理**本地方法调用**的跳板机制。当Java代码调用JNI(Java Native Interface)函数时,NIMT负责桥接Java与本地代码(如C/C++),确保参数传递和栈帧转换正确[^2]。 2. **关键配置参数** `nimt-trampolines=8096` 用于指定预分配的跳板数量。该配置常见于: - **AOT编译场景**:提前编译的本地代码需要固定跳板地址 - **闪退问题**:跳板不足会导致`UnsatisfiedLinkError`或崩溃 *典型配置示例(如引用[2]):* ```shell nrgctx-trampolines=8096,nimt-trampolines=8096,ntrampolines=4048 ``` 3. **应用场景** - 高频JNI调用的应用(如游戏/音视频处理) - 解决因跳板耗尽导致的随机崩溃 - 提升本地方法调用性能 --- ### **二、jcmd(Java Command)** 1. **基础功能** JDK内置的多功能诊断工具,主要用途包括: - 列出当前JVM进程:`jcmd -l` - 查看特定进程信息:`jcmd <PID> help` - 获取JVM运行时数据(堆/线程/加载等) 2. **核心使用场景** **① 线程分析** ```shell jcmd <PID> Thread.print # 打印线程栈(等效jstack) ``` **② 堆内存快照** ```shell jcmd <PID> GC.heap_dump /path/to/dump.hprof # 生成堆转储(等效jmap) ``` **③ 性能监控** ```shell jcmd <PID> PerfCounter.print # 显示JVM性能计数器 jcmd <PID> VM.native_memory # 监控本地内存(需开启-XX:NativeMemoryTracking) ``` **④ 动态控制JFR** ```shell jcmd <PID> JFR.start duration=60s filename=recording.jfr # 开启飞行记录 jcmd <PID> JFR.dump name=recording filename=snapshot.jfr # 导出记录 ``` 3. **优势特性** - 单二进制文件集成多工具功能(替代jstack/jinfo/jmap) - 动态attach到运行中的JVM无需重启 - 支持脚本自动化诊断 --- ### **典型问题分析案例** ```shell # 步骤1:查找Java进程ID $ jcmd -l 12345 com.example.App # 步骤2:检查线程死锁 $ jcmd 12345 Thread.print -l # 步骤3:分析内存泄漏 $ jcmd 12345 GC.heap_dump /tmp/heap.hprof $ jhat /tmp/heap.hprof # 启动分析服务 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值