Hotspot JVM 中的 JITed 代码中是否可以放置断点?
Can breakpoints be placed in JITed code in the Hotspot JVM?
我读到这在(现已退休)Harmony JVM 中是可能的,但是 Hotspot JVM 呢?这可能吗?如果不是,断点是否会阻止代码被 JITed,这意味着断点的代价更大?
发生的情况是 JVM 取消优化该方法以允许向其添加断点。
取消优化并不一定意味着该方法返回到字节码形式并且仅被解释。但它可能会撤消重新排序代码、内联方法等的优化。这些使得调试器很难将执行状态与源代码相关联......这正是程序员正在查看的内容。
但是,是的,运行您的代码在调试模式下确实使其变慢。
这样想,当您在符号调试器中调试 C 可执行文件时,C 代码已(静态)编译为本机代码并链接。然而,调试器能够插入断点、单步执行代码、查看堆栈上的变量等等。
如果有的话,JVM 更容易做到这一点...因为>>它<<控制编译为本机代码。
我读到这在(现已退休)Harmony JVM 中是可能的,但是 Hotspot JVM 呢?这可能吗?如果不是,断点是否会阻止代码被 JITed,这意味着断点的代价更大?
发生的情况是 JVM 取消优化该方法以允许向其添加断点。
取消优化并不一定意味着该方法返回到字节码形式并且仅被解释。但它可能会撤消重新排序代码、内联方法等的优化。这些使得调试器很难将执行状态与源代码相关联......这正是程序员正在查看的内容。
但是,是的,运行您的代码在调试模式下确实使其变慢。
这样想,当您在符号调试器中调试 C 可执行文件时,C 代码已(静态)编译为本机代码并链接。然而,调试器能够插入断点、单步执行代码、查看堆栈上的变量等等。
如果有的话,JVM 更容易做到这一点...因为>>它<<控制编译为本机代码。