
Java(javac) XXX的时候,java.exe(javac.exe)的工作就是找到合适的JRE来执行类文件。java.exe(javac.exe)依照如下逻辑来寻找JRE:
自己的目录下有没有JRE目录(这么说并不是非常精确,原因请详见JDK源代码,在此不作特别说明); 父目录下的JRE子目录; 查询Windows Registry (HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment);
所以,java.exe(javac.exe)的执行结果和“您计算机里面哪一个java.exe被执行,然后哪一套JRE被拿来执行java应用程序”有莫大的关系。
作者:RednaxelaFX链接:https://www.zhihu.com/question/36051329/answer/65735192
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
例如这个?Bytecode Visualizer不过题主想要的功能多半还得在上面这个工具的基础之上再扩展一下。我自己做字节码层面调试的时候通常就直接用JDK自带的jdb命令行调试器,支持字节码层面调试,不过用起来当然没有带GUI的工具那么直观咯。之前写的一篇博文里有用jdb举过例子:借HSDB来探索HotSpot VM的运行时数据。虽然那篇没有提到,但其实用 stepi 和 nexti 命令就可以在jdb里做字节码层面的单步调试(普通的基于代码行的单步调试命令则是 step 和 next,少个i后缀)。jdb的字节码层面调试最让人不爽的一点就是它不能在任意字节码指令上设断点。我以前用jdb都是只能设方法入口断点然后不断的 stepi 单步走到我要的指令上。这对稍微复杂一点的调试工作来说就极其纱布。jdb间接基于JVMTI实现,而JVMTI的SetBreakpoint函数其实是可以在任意字节码指令上设断点的,只要GetJLocationFormat返回1(JVMTI_JLOCATION_JVMBCI)。jdb直接基于的是JVMTI之上的Java层包装,JDI。它的本体入口在这里:jdk7u/jdk7u/jdk: e228aaace9c9 src/share/classes/com/sun/tools/example/debug/tty/TTY.java而断点相关的部分在这里:jdk7u/jdk7u/jdk: e228aaace9c9 src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java鼓捣鼓捣这里就能让它支持字节码指令层面(BCI,bytecode index)的断点…
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)