为什么引导类加载器会加载精确定位(这是一个javaagent)?

时间:2018-05-20 11:42:50

标签: java javaagents

我正在阅读关于javaagent的精确代码,我发现了一个有线问题。

通常,java代理应该由App类加载器加载,就像在classpath中一样。但我发现pinpoint由引导类加载器加载。我检查了pinpoint-bootstrap.jar是否附加到sun.boot.class.path。我对黑魔法很感兴趣。

这是代码。 https://github.com/naver/pinpoint/blob/master/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/PinpointBootStrap.java#L45

精确定位如何实现?也许@emeroad很清楚。

1 个答案:

答案 0 :(得分:1)

这是Boot-Class-Path atribute in the agent's manifest的结果。由于此条目,代理程序的jar文件被添加到引导加载程序的搜索路径中。此外,还可以将代理程序附加到系统(应用程序)类加载器,就像为任何代理程序完成一样。

所有这些都是在第一次加载代理的条目类之前完成的。由于系统类加载器的父级第一语义,然后请求引导类加载器首先加载代理类,使其成功完成。因此,代理主类现在由引导程序加载,而不是在您观察时加载系统类加载程序。

另一方面,这个解决方案有点黑客。相反,应该有一个启动代理将主代理附加到引导加载程序。这样,如果某个备用VM应用不同的加载顺序,则可以避免依赖加载器层次结构。