根据 JDK Tutorial 的描述,除非在执行 try 或 catch 代码时线程被中断或 JVM 退出,finally 中的逻辑始终会执行。因此 finally 关键字常被用于释放资源,防止程序出现异常时出现资源泄露。本文主要探讨其在 JVM 层面的实现原理,以及 synchronized 关键字在类似场景的处理手段。首先来看一段简单的 try-finally 代码
1 | public void testWithTryFinally() { |
根据 JDK Tutorial 的描述,除非在执行 try 或 catch 代码时线程被中断或 JVM 退出,finally 中的逻辑始终会执行。因此 finally 关键字常被用于释放资源,防止程序出现异常时出现资源泄露。本文主要探讨其在 JVM 层面的实现原理,以及 synchronized 关键字在类似场景的处理手段。首先来看一段简单的 try-finally 代码
1 | public void testWithTryFinally() { |
HSDB(Hotspot Debugger)
,是一款内置于 SA 中的 GUI 调试工具,可用于调试 JVM 运行时数据,从而进行故障排除
检测不同 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 版本即可解决
Update your browser to view this website correctly. Update my browser now