JVM:可视化 JVM 故障处理工具( 二 )

首先在命令行中使用命令 jps -l 查看 Java 进程的 pid :
PS C:\Users\inwsy> jps -l1648 com.geekdigging.lesson04.jvmtools.HSDB_Test87049280 org.jetbrains.jps.cmdline.Launcher14724 jdk.jcmd/sun.tools.jps.Jps3220 org/netbeans/Main1514420572 org.jetbrains.jps.cmdline.Launcher7548 sun.jvm.hotspot.HSDB可以看到 , 我们刚写的测试方法的 pid 是 1648, 在 HSDB 中点击 File > Attach to Hotspot process :
JVM:可视化 JVM 故障处理工具文章插图
第一个看到的就是当前进程中的线程:
JVM:可视化 JVM 故障处理工具文章插图
到这里 , 我们的准备工作就已经结束 , 接着我们使用 Tools > Class Browser 找到对象 B 的内存地址:
JVM:可视化 JVM 故障处理工具文章插图
图中红框框起来的是我自己写的三个类 , 可以看到我这里 B 的内存地址是 0x00000007c0060c18 。
接下来 , 使用 Tools > Inspector 查看这个对象的详细信息:
JVM:可视化 JVM 故障处理工具文章插图
vtable 是虚表方法 , 这里我们看到 class B 有 7 个虚表方法 , 因为所有的对象都继承自 Object, 所以 B 继承了 Object 的 5 个方法 , 然后还继承了 A 的一个方法 , 自己重写了一个方法 , 总共是 7 个方法 。
这个我们可以进行一下验证 , 可以在 Windows > Console 中使用 mem 命令进行查看 。
那么我们可以开始计算 ,vtable 是在 instanceKlass 对象实例的尾部 , 而 instanceKlass 大小在 64 位系统的大小为 0x1B8, 因此 vtable 的起始地址等于 instanceKlass 的内存首地址加上 0x1B8 等于 7C0060DD0。
JVM:可视化 JVM 故障处理工具文章插图
接下来 , 我们在 Windows > Console 中使用 mem 命令进行验证:
JVM:可视化 JVM 故障处理工具文章插图
第一列是方法实际在堆中的内存地址 , 第二列则是内存指针地址 , 我们可以将拿到的内存指针地址去 A,B 和 Object 中分别查看 , 可以看到前 5 行对应的是 Object 的方法 , 第 6 行对应的是 A 对象中的方法 , 第 7 行则对应 B 对象中的方法 。
3. JConsoleJConsole(Java Monitoring and Management Console) 是一款基于 JMX(Java Manage-ment Extensions) 的可视化监视、管理工具 。 它的主要功能是通过 JMX 的 MBean(Managed Bean) 对系统进行信息收集和参数动态调整 。
JConsole 位于 JDK/bin 这个目录下 , 直接双击 jconsole.exe 就可以直接启动 , 在启动之后 , 会自动搜索出当前在本机运行的所有虚拟机进程 。
JVM:可视化 JVM 故障处理工具文章插图
这里可以看到我本机目前运行了一个 JConsole, 一个 idea, 还有一个启动的 tomcat 的源码 。
随便双击一个服务 , 进入主页面:
JVM:可视化 JVM 故障处理工具文章插图
可以看到主界面里共包括概述、内存、线程、类、 VM 摘要、 MBean 六个页签 。
还是来个小示例 , 我们来了解下它的监控功能 。
public class MonitoringTest {// 内存占位对象 , 一个对象大约 64KBstatic class OOMObject {public byte[] placeholder = new byte[64 * 1024];}public static void fillHeap(int nums) throws InterruptedException {List