【问题标题】:Why the pinpoint (which is a javaagent) is loaded by bootstrap class loader?为什么 pinpoint(这是一个 javaagent)由引导类加载器加载?
【发布时间】:2018-05-20 11:42:50
【问题描述】:

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

通常,Java 代理应该由 App 类加载器加载,就像它在类路径中一样。但我发现 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

pinpoint 如何做到这一点?也许@emeroad 很清楚。

【问题讨论】:

    标签: java javaagents


    【解决方案1】:

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

    所有这些都是在第一次加载代理的入口类之前完成的。由于系统类加载器的父级优先语义,引导类加载器随后被请求首先加载代理类,它成功完成了。因此,代理主类现在由引导程序加载,而不是您观察到的系统类加载器。

    顺便说一句,这个解决方案有点老套。相反,应该有一个启动器代理将主代理附加到引导加载程序。这样,您就可以避免依赖加载器层次结构,以防某些替代 VM 应用不同的加载顺序。

    【讨论】:

    • 太好了,对我很有帮助。
    • 关于Rather, there should be a launcher agent that appends the main agent to the bootstrap loader,你的意思是我们可以创建两个java代理。将主代理添加到第一个代理中的引导类路径。
    • 您创建一个 Java 代理,然后调用注入到 tge 引导加载程序的工件的任何启动器方法。
    • “应该有一个启动器代理将主代理附加到引导加载程序”。你能扩展吗?这有点难以理解。不错的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多