揭开try-catch-finally的神秘面纱

根据 JDK Tutorial 的描述,除非在执行 try 或 catch 代码时线程被中断或 JVM 退出,finally 中的逻辑始终会执行。因此 finally 关键字常被用于释放资源,防止程序出现异常时出现资源泄露。本文主要探讨其在 JVM 层面的实现原理,以及 synchronized 关键字在类似场景的处理手段。首先来看一段简单的 try-finally 代码

1
2
3
4
5
6
7
public void testWithTryFinally() {
try {
System.out.println("try");
} finally {
System.out.println("finally");
}
}

HSDB从入门到实战

HSDB(Hotspot Debugger),是一款内置于 SA 中的 GUI 调试工具,可用于调试 JVM 运行时数据,从而进行故障排除

启动HSDB

检测不同 JDK 版本需要使用不同的 HSDB 版本,否则容易出现无法扫描到对象等莫名其妙的问题

  • Mac:JDK7 和 JDK8 均可以采用以下的方式

    1
    $ sudo java -cp ,:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/lib/sa-jdi.jar sun.jvm.hotspot.HSDB

    事实上经过测试,即使通过 JDK8 自带的 sa-jdi.jar 去扫描对象(scanoops)的时候也会发生扫不到的情况,但可以通过其他手段代替

    而 JDK11 的启动方式有些区别

    1
    $ /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/bin/jhsdb hsdb

    事实上经过测试,该版本启动的 HSDB 会少支持一些指令(比如 mem, whatis),因此目前不推荐使用该版本

  • Windows:

    1
    $ java -classpath "%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB

其中启动版本可以使用 /usr/libexec/java_home -V 获取

若遇到 Unable to locate an executable at “/Users/xx/.jenv/versions/1.7/bin/jhsdb” (-1) 可通过 Jenv 切换到当前 Jdk 版本即可解决

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×