有没有办法检测JVM引导阶段的结束?
编辑::
所以为了提供更多的上下文,我想要做的是检测JDK.这是一个完整的仪器,记录每个LOAD,STORE,INVOKE字节码指令.在执行指令时,它们的数据被发送到静态方法,该方法从xbootclasspath加载.此静态方法捕获所有这些信息,并将所有这些信息存储为稍后执行分析的跟踪.
现在,当我为JDK执行此操作时,我不想打扰JVM中加载类的方式,这可能会导致程序崩溃.我猜测最好的方法是检测JVM完成引导的时间点,以便我可以安全地打开我的仪器.(我计划不进行任何代码检测,而引导正在进行中.)这是否是正确的方法呢?
除了我之前关于调查FERRARI和MAJOR 的评论之外,我还想说几件事:
所以这是我对你可以做什么的有根据的猜测(尚未测试):
BootstrapLock,如下所述。public class BootstrapLock {
private static volatile boolean inBootstrap = true;
public static boolean inBootstrap() {
return inBootstrap;
}
public static synchronized void setEndOfBS() {
inBootstrap = false;
}
}
public class DummyAgent {
public static void premain(String options, Instrumentation ins) {
BootstrapLock.setEndOfBS();
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本上逻辑如下:
inBootstrap。我不确定我是否有足够的时间来测试这个,但至少我想在这里发布这个答案,这样也许你,Vijai,也可以研究它并提供一些反馈。四只眼睛看到的东西比两只眼睛多...
更新:一位 FERRARI 作者已经回答了我的询问并证实了我上面的解释。您可以使用 java 代理作为 JVM 已完成引导的标记。也许您甚至不需要额外的类,只需检查代理是否已加载到 JVM 中即可。这会让事情变得更简单,我只是不知道它是否表现良好。测试一下吧。
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |