JVM:可视化 JVM 故障处理工具
文章插图
本文内容过于硬核 , 建议有 Java 相关经验人士阅读 。
1. 可视化工具在 JDK 中为我们提供了大量的 JVM 故障处理工具 , 都在 JDK 的 bin 目录下:
文章插图
这其中除了大量的命令行工具以外 , 还为我们提供了更加方便快捷的可视化工具 , 主要是以下这 4 个:
- JConsole: 最古老的工具 , 早在 JDK 5 时期就已经存在的虚拟机监控工具 。
- JHSDB: 名义上在 JDK 9 中才正式提供 , 但之前已经以 sa-jdi.jar 包里面的 HSDB(可视化工具) 和 CLHSDB(命令行工具) 的形式存在了很长一段时间 。
- VisualVM: 在 JDK 6 Update 7 中首次发布 , 直到 JRockit Mission Control 与 OracleJDK 的融合工作完成之前 , 它都曾是 Oracle 主力推动的多合一故障处理工具 , 现在它已经从 OracleJDK 中分离出来 , 成为一个独立发展的开源项目 。
- JMC: Java Mission Control, 曾经是大名鼎鼎的来自 BEA 公司的图形化诊断工具 , 随着 BEA 公司被 Oracle 收购 , 它便被融合进 OracleJDK 之中 。 在 JDK 7 Update 40 时开始随 JDK 一起发布 , 后来 Java SE Advanced 产品线建立 ,Oracle 明确区分了 Oracle OpenJDK 和 OracleJDK 的差别 ,JMC 从 JDK 11 开始又被移除出 JDK。
使用方式由于在 JDK 9 之前没有正式提供 , 所以也未在 JDK 的 bin 目录下提供直接可执行文件 , 需要在命令行执行命令才能启动 。
首先在命令行中先 cd 至 C:\Program Files\Java\jdk1.8.0_221\lib 目录 , 然后执行:
java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB
我在执行这句命令的时候报了个错:Exception in thread "Thread-1" java.lang.UnsatisfiedLinkError: Can't load library: C:\Program Files\Java\jdk-11.0.4\bin\sawindbg.dllat java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2620)at java.base/java.lang.Runtime.load0(Runtime.java:767)at java.base/java.lang.System.load(System.java:1831)at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.(WindbgDebuggerLocal.java:661)at sun.jvm.hotspot.HotSpotAgent.setupDebuggerWin32(HotSpotAgent.java:567)at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:335)at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)at sun.jvm.hotspot.HSDB.attach(HSDB.java:1184)at sun.jvm.hotspot.HSDB.access$1700(HSDB.java:53)at sun.jvm.hotspot.HSDB$25$1.run(HSDB.java:456)at sun.jvm.hotspot.utilities.WorkerThread$MainLoop.run(WorkerThread.java:66)at java.base/java.lang.Thread.run(Thread.java:834)
含义是有一个 sawindbg.dll 在 jdk 的目录下找不到 , 因为我本地有多个 jdk, 配置环境变量的是 jdk 11, 我在 jdk 8 的 jre 的 bin 目录下找到了这个文件 , 直接 copy 到 jdk 11 的bin 目录下解决此问题 。执行完成后会打开这么个界面:
文章插图
接下来 , 我们写一小段测试代码:
public abstract class A {public void printMe() {System.out.println("I am A class");}public abstract void sayHello();}public class B extends A {@Overridepublic void sayHello() {System.out.println("I am B class");}}public class HSDB_Test {public static void main(String[] args) throws IOException {A obj = new B();// 无意义 , 单纯用作卡住主线程 , 防止线程结束System.in.read();System.out.println(obj);}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Facebook Messenger收集的数据量有多吓人?可视化对比图告诉你
- 数据可视化三节课之二:可视化的使用
- 历时 1 个月,做了 10 个 Python 可视化动图,用心且精美...
- 韩国电动车故障索赔量4年内翻46倍
- 苹果:影响新设备设置的“iCloud账号与登录”故障已解决
- 阿里云|1分钟故障响应 阿里云AIoT联合昆岳互联打造国内首个环保行业工业互联网平台
- 一个奇特故障带来的诡异电脑问题
- 安卓面试必备的JVM虚拟机制详解,看完之后简历上多一个技能
- 刚买的走步机,收到没几天就出现故障,对方拒绝退货
- 数据|南方电网超高压公司成功举办首届数据可视化分析大赛