Java|Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题

Java|Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题

文章图片

Java|Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题

文章图片

Java|Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题

文章图片


从 Java Agent 报错开始 , 到 JVM 原理 , 到 glibc 线程安全 , 再到 pthread tls , 逐步探究 Java Agent 诡异报错 。
背景 由于阿里云多个产品都提供了 Java Agent 给用户使用 , 在多个 Java Agent 一起使用的场景下 , 造成了总体 Java Agent 耗时增加 , 各个 Agent 各自存储 , 导致内存占用、资源消耗增加 。
MSE 发起了 one-java-agent 项目 , 能够协同各个 Java Agent;同时也支持更加高效、方便的字节码注入 。
其中 , 各个 Java Agent 作为 one-java-agent 的 plugin , 在 premain 阶段是通过多线程启动的方式来加载 , 从而将启动速度由 O(n)降低到 O(1) , 降低了整体 Java Agent 整体的加载时间 。
问题 但最近在新版 Agent 验证过程中 , one-java-agent 的 premain 阶段 , 发现有如下报错:
2022-06-15 06:22:47 [oneagent plugin arms-agent start
ERROR c.a.o.plugin.PluginManagerImpl -start plugin error name: arms-agentcom.alibaba.oneagent.plugin.PluginException: start error agent jar::/home/admin/.opt/ArmsAgent/plugins/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar at com.alibaba.oneagent.plugin.TraditionalPlugin.start(TraditionalPlugin.java:113) at com.alibaba.oneagent.plugin.PluginManagerImpl.startOnePlugin(PluginManagerImpl.java:294) at com.alibaba.oneagent.plugin.PluginManagerImpl.access$200(PluginManagerImpl.java:22) at com.alibaba.oneagent.plugin.PluginManagerImpl$2.run(PluginManagerImpl.java:325) at java.lang.Thread.run(Thread.java:750)Caused by: java.lang.InternalError: null at sun.instrument.InstrumentationImpl.appendToClassLoaderSearch0(Native Method) at sun.instrument.InstrumentationImpl.appendToSystemClassLoaderSearch(InstrumentationImpl.java:200) at com.alibaba.oneagent.plugin.TraditionalPlugin.start(TraditionalPlugin.java:100) ... 4 common frames omitted2022-06-16 09:51:09 [oneagent plugin ahas-java-agent start
ERROR c.a.o.plugin.PluginManagerImpl -start plugin error name: ahas-java-agentcom.alibaba.oneagent.plugin.PluginException: start error agent jar::/home/admin/.opt/ArmsAgent/plugins/ahas-java-agent/ahas-java-agent.jar at com.alibaba.oneagent.plugin.TraditionalPlugin.start(TraditionalPlugin.java:113) at com.alibaba.oneagent.plugin.PluginManagerImpl.startOnePlugin(PluginManagerImpl.java:294) at com.alibaba.oneagent.plugin.PluginManagerImpl.access$200(PluginManagerImpl.java:22) at com.alibaba.oneagent.plugin.PluginManagerImpl$2.run(PluginManagerImpl.java:325) at java.lang.Thread.run(Thread.java:855)Caused by: java.lang.IllegalArgumentException: null at sun.instrument.InstrumentationImpl.appendToClassLoaderSearch0(Native Method) at sun.instrument.InstrumentationImpl.appendToSystemClassLoaderSearch(InstrumentationImpl.java:200) at com.alibaba.oneagent.plugin.TraditionalPlugin.start(TraditionalPlugin.java:100) ... 4 common frames omitted 熟悉 Java Agent 的同学可能能注意到 , 这是调用 Instrumentation.appendToSystemClassLoaderSearch 报错了 。
但首先 appendToSystemClassLoaderSearch 的路径是存在的;其次 , 这个报错的真实原因是在 C++部分 , 比较难排查 。
但不管怎样 , 还是要深究下为什么出现这个错误 。
首先我们梳理下具体的调用流程 , 下面的分析都是基于此来分析的:
- Instrumentation.appendToSystemClassLoaderSearch (java) - appendToClassLoaderSearch0 (JNI) `- appendToClassLoaderSearch |- AddToSystemClassLoaderSearch | `-create_class_path_zip_entry | `-stat `-convertUft8ToPlatformString `- iconv 打日志、确定现场 因为这个问题在容器环境下 , 有 10% 的概率出现 , 比较容易复现 , 于是就用 dragonwell8 的最新代码 , 加日志 , 确认下现场 。