You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用App Dynamics Agent时触发InaccessibleObjectException问题求助

问题解决:JRE11镜像下Java8代码集成AppDynamics启动报错InaccessibleObjectException

问题背景

应用基于Java8开发,原运行在JRE8 Docker镜像,因合规要求切换到JRE11镜像但代码未升级。集成AppDynamics agent后启动时抛出InaccessibleObjectException,移除agent后应用可正常启动,异常发生在Ehcache 2.10.3加载缓存阶段。

错误信息

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field final com.singularity.ee.agent.appagent.kernel.bootimpl.FastMethodInterceptorDelegatorImpl com.singularity.ee.agent.appagent.kernel.bootimpl.FastMethodInterceptorDelegatorImpl$1.this$0 accessible: module com.appdynamics.appagent does not "opens com.singularity.ee.agent.appagent.kernel.bootimpl" to unnamed module @7a4264e1
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:340)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:280)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
    at net.sf.ehcache.pool.sizeof.ObjectGraphWalker.getAllFields(ObjectGraphWalker.java:271)
    at net.sf.ehcache.pool.sizeof.ObjectGraphWalker.getFilteredFields(ObjectGraphWalker.java:229)
    at net.sf.ehcache.pool.sizeof.ObjectGraphWalker.walk(ObjectGraphWalker.java:160)
    at net.sf.ehcache.pool.sizeof.SizeOf.deepSizeOf(SizeOf.java:72)
    at net.sf.ehcache.pool.impl.DefaultSizeOfEngine.sizeOf(DefaultSizeOfEngine.java:190)
    at net.sf.ehcache.pool.impl.AbstractPoolAccessor.add(AbstractPoolAccessor.java:63)
    at net.sf.ehcache.store.MemoryStore.put(MemoryStore.java:281)
    at net.sf.ehcache.Cache.putInternal(Cache.java:1620)
    at net.sf.ehcache.Cache.put(Cache.java:1546)
    at net.sf.ehcache.Cache.put(Cache.java:1511)

原因分析

Java9及以上引入的模块系统(JPMS)限制了跨模块的反射访问:

  • AppDynamics agent以模块化方式运行(模块名为com.appdynamics.appagent),默认不会开放内部包给未命名模块(你的Java8编译代码属于未命名模块)。
  • Ehcache 2.10.3的SizeOf机制会通过反射遍历对象所有字段计算缓存大小,遍历到AppDynamics agent内部类字段时,触发JPMS访问限制抛出异常。

解决方案

方案1:添加JVM启动参数开放模块访问

针对错误提示的包,给JVM添加--add-opens参数,允许未命名模块反射访问AppDynamics agent的对应包:

--add-opens com.appdynamics.appagent/com.singularity.ee.agent.appagent.kernel.bootimpl=ALL-UNNAMED

如果后续出现其他类似opens错误,按相同格式添加对应包的参数即可。

方案2:升级AppDynamics agent版本

使用支持Java11的AppDynamics agent版本,新版本已适配JPMS模块系统,会自动处理必要的包开放,避免反射访问限制。

方案3:升级Ehcache到兼容版本

Ehcache 2.x系列对JPMS支持不佳,升级到Ehcache 3.x(完全兼容Java9+)可从根源解决SizeOf反射与模块系统的冲突。注意:升级需调整Ehcache配置和适配API变更,需评估改造量。

方案4:调整Ehcache的SizeOf配置

通过配置禁用Ehcache的反射式SizeOf计算,或跳过对AppDynamics相关类的遍历:

  1. 添加系统属性禁用动态代理的SizeOf检测:
    -Dnet.sf.ehcache.disable.dynamic.proxies=true
    
  2. 或在ehcache.xml中配置SizeOf策略,排除AppDynamics的包:
    <sizeOfPolicy>
        <exclude class="com.singularity.ee.**"/>
    </sizeOfPolicy>
    

此方案需注意:可能影响缓存池大小计算的准确性,需测试验证缓存行为是否正常。

内容的提问来源于stack exchange,提问作者Abhishek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:03:42