throw:java.lang.NoClassDefFoundError
版本:5.2.7
运行环境:linux
问题描述:启用缓存模式,运行一段时间后会报NoClassDefFoundError,可能有一定的概率,不是每次都能重现
---ts=2022-05-29 13:49:23;thread_name=pool-cal-14;id=36;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@33909752
---[0.40077ms] com.abc.task.RiskPreRuleTask:execute() [throws Exception] +---[0.001793ms] com.abc.entity.TaskResult:<init>() #30 +---[0.002145ms] com.abc.context.CrrContext:traceStart() #31 +---[0.002014ms] com.abc.context.CrrContext:getCustId() #32 +---[0.001781ms] com.abc.service.CrrStopWatch:<init>() #32 +---[0.00263ms] com.abc.context.CrrContext:appendWatch() #33 +---[0.00171ms] com.abc.context.CrrContext:getBankId() #35 +---[0.001811ms] com.abc.context.CrrContext:getCalType() #36 +---[0.001941ms] com.abc.service.CrrStopWatch:start() #37 ---throw:java.lang.NoClassDefFoundError #2 [Script_1653786625635_86]
通过arthas能搜索到该类
name Script_1653786625635_86/263764583
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name Script_1653786625635_86/263764583
modifier public
annotation
interfaces
super-class +-com.googlecode.aviator.ClassExpression
+-com.googlecode.aviator.BaseExpression
+-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@33909752
+-sun.misc.Launcher$ExtClassLoader@200a570f
classLoaderHash 33909752
一般跟你的类加载机制有关系,这种问题还是要靠你自己去定位了。
感谢回复,我理解一个表达式重复执行多次,不会引起类加载机制有变化吧,第一次执行编译后会缓存class,遗憾的是这两天又没再出现过了,很难重现问题,但又可能发生,有没有理论上分析可能的问题原因,感谢。 我目前想到的是当捕获到NoClassDefFoundError错误,就把表达式缓存清空,然后再重新执行一次表达式,但截止目前这个逻辑没有验证到,不知道是否会有后遗症
@luoxueliang 可能你们定制了 classloader? 或者用的框架自己定制了。
重新编译没什么影响,就是那一刻耗时和开销大一点。
用的是springboot,没有自定义classloader,那我先按这种方式再观察看看,非常感谢您的回复
同样使用编译缓存遇到。不过我的情况可能特殊,用JProfiler去监控远程Linux的压测服务时,突然报错,后来没有出现,当时怀疑可能是JProfiler连接过程中导致。
java.lang.NoClassDefFoundError: Script_1654006198953_58 at Script_1654006198953_58/1862339198.execute0(Script_1654006198953_58:1) at com.googlecode.aviator.ClassExpression.executeDirectly(ClassExpression.java:44) at com.googlecode.aviator.BaseExpression.execute(BaseExpression.java:245)
我也不太确定当时报错的时候,是否有arthas采集应用cpu信息,当天报过两次,但是等我调整完(加上捕获NoClassDefFoundError,表达式缓存置失效重新调用),跑了两天也没再重现,后续我再跑的同时用arthas采集cpu信息再关注下看看