jdk之jhat命令

jhat命令 -- Java Heap Analyse Tool
用途:是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言
第一步:导出堆

第二步:分析堆文件

第三步:查看html

有时你dump出来的堆很大,在启动时会报堆空间不足的错误,可以使用如下参数:
jhat -J-Xmx512m <heap dump file>

对于jhat启动后显示的html页面中功能:
(1)显示出堆中所包含的所有的类

(2)从根集能引用到的对象

(3)显示平台包括的所有类的实例数量

(4)堆实例的分布表

(5)执行对象查询语句

更多关于对象查询语言的信息,见这篇文章:
http://blog.youkuaiyun.com/gtuu0123/archive/2010/11/27/6039592.aspx

### JDK 命令列表及用法 #### 1. `javap` `javap` 是一个反编译工具,用于查看 `.class` 文件的内容。它可以显示类的结构、字段、方法签名以及其他元数据信息。 ```bash javap [options] classname ``` - `-c`: 显示字节码指令[^1]。 --- #### 2. `jps` `jps` (Java Process Status Tool) 用于列出当前系统中的所有 Java 进程及其 ID (`PID`)。 ```bash jps [options] ``` - 默认情况下会显示本地主机上的所有 Java 应用程序的 PID 和主类名称[^1]。 --- #### 3. `jstat` `jstat` (Java Statistics Monitoring Tool) 用于监控 JVM 的性能统计信息,包括垃圾回收器的行为、内存分配情况等。 ```bash jstat [option vmid [interval[s|ms] [count]]] ``` - `-gcutil`: 显示 GC 使用率摘要[^1]。 - `-gccapacity`: 显示 GC 容量摘要[^1]。 --- #### 4. `jcmd` `jcmd` (Java Command-line Diagnostic Tool) 可向正在运行的 Java 进程发送诊断命令。它支持多种操作,例如触发堆转储、线程转储等。 ```bash jcmd pid command_name arguments... ``` - `GC.heap_dump <filename>`: 创建堆转储文件[^1]。 - `Thread.print`: 打印线程堆栈信息。 --- #### 5. `jmap` `jmap` (Memory Map for Java) 工具可以生成堆转储文件并提供有关 Java 对象和类加载器的信息。 ```bash jmap [options] pid ``` - `-dump:live,format=b,file=<file-path>`: 将活动对象导出到指定路径的二进制文件中[^3]。 --- #### 6. `jhat` `jhat` (Java Heap Analysis Tool) 用于解析由 `jmap` 或其他工具生成的堆转储文件,并通过 Web 接口展示分析结果。 ```bash jhat heap-dump-file ``` --- #### 7. `jstack` `jstack` 工具用于生成 Java 虚拟机中每个线程的堆栈跟踪信息。这对于调试死锁或其他并发问题非常有用。 ```bash jstack [options] pid ``` - `-l`: 列出更多关于锁的信息[^2]。 - `-m`: 显示本机框架信息[^2]。 - 示例:检测死锁时可结合 `-F` 参数强制获取线程快照。 --- #### 死锁案例分析 以下是一个简单的死锁代码示例,可以通过 `jstack` 来定位问题。 ```java public class DeadLock { public static void main(String[] args) { A a = new A(); B b = new B(); Thread thread = new Thread(() -> { Thread.currentThread().setName("a线程"); a.foo(b); }); Thread thread1 = new Thread(() -> { Thread.currentThread().setName("b线程"); b.bar(a); }); thread.start(); thread1.start(); } } class A { public synchronized void foo(B b) { System.out.println("当前线程名:" + Thread.currentThread().getName() + "进入了A的foo方法"); System.out.println(Thread.currentThread().getName() + "准备调用b的last方法"); b.last(); } public synchronized void last() { System.out.println("调用了A类的last方法"); } } class B { public synchronized void bar(A a) { System.out.println("当前线程名:" + Thread.currentThread().getName() + "进入了B的bar方法"); System.out.println(Thread.currentThread().getName() + "准备调用a的last方法"); a.last(); } public synchronized void last() { System.out.println("调用了B类的last方法"); } } ``` 当发生死锁时,可通过如下方式捕获线程堆栈信息: ```bash jstack -l <pid> ``` --- #### 性能调优相关命令 对于性能调优场景,还可以使用 `jinfo` 修改 JVM 配置参数。例如启用详细的垃圾收集日志输出: ```bash jinfo -flag +PrintGCDetails <pid> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值