使用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相关类的遍历:
- 添加系统属性禁用动态代理的SizeOf检测:
-Dnet.sf.ehcache.disable.dynamic.proxies=true - 或在ehcache.xml中配置SizeOf策略,排除AppDynamics的包:
<sizeOfPolicy> <exclude class="com.singularity.ee.**"/> </sizeOfPolicy>
此方案需注意:可能影响缓存池大小计算的准确性,需测试验证缓存行为是否正常。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

