我正在阅读关于javaagent的精确代码,我发现了一个有线问题。
通常,java代理应该由App类加载器加载,就像在classpath中一样。但我发现pinpoint由引导类加载器加载。我检查了pinpoint-bootstrap.jar是否附加到sun.boot.class.path
。我对黑魔法很感兴趣。
精确定位如何实现?也许@emeroad很清楚。
答案 0 :(得分:1)
这是Boot-Class-Path atribute in the agent's manifest的结果。由于此条目,代理程序的jar文件被添加到引导加载程序的搜索路径中。此外,还可以将代理程序附加到系统(应用程序)类加载器,就像为任何代理程序完成一样。
所有这些都是在第一次加载代理的条目类之前完成的。由于系统类加载器的父级第一语义,然后请求引导类加载器首先加载代理类,使其成功完成。因此,代理主类现在由引导程序加载,而不是在您观察时加载系统类加载程序。
另一方面,这个解决方案有点黑客。相反,应该有一个启动代理将主代理附加到引导加载程序。这样,如果某个备用VM应用不同的加载顺序,则可以避免依赖加载器层次结构。