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

挂载javaagent时ClassLoader.loadClass抛出栈溢出导致catalina日志占满磁盘

问题根因分析

从给出的堆栈信息来看,StackOverflowError是ClassLoader.loadClass方法递归调用死循环导致的,这也是catalina.out持续被打满的直接原因:每次递归溢出都会打印全量异常栈,频繁触发就会快速占用磁盘空间。
常见触发原因如下:

  • 类加载逻辑与Tomcat双亲委派模型冲突
    Tomcat自身实现了多层级的类加载器结构(包含Bootstrap、System、Common、Shared、WebApp层级),如果JavaAgent自定义的类加载逻辑没有兼容该结构,很容易出现父类加载器和子类加载器循环委托加载同一个类的场景,直接触发递归死循环。
  • 字节码增强逻辑触发类加载循环
    如果JavaAgent的增强逻辑涉及ClassLoader、ConcurrentHashMap这类JDK基础类/类加载相关类,增强逻辑执行过程中又需要触发目标类的加载,就会形成「触发类加载->执行增强逻辑->再次触发同类加载」的无限循环,最终栈溢出。
  • 多JavaAgent共存冲突
    如果同时挂载了多个JavaAgent(例如APM监控探针、热部署探针、性能调试探针),不同Agent的类加载拦截逻辑互相触发,也会导致重复的loadClass递归调用。
排查建议
  • 优先排除多Agent冲突:只保留当前问题Agent启动Tomcat,验证问题是否复现
  • 增加类加载调试参数:Tomcat启动时追加-verbose:class启动参数,输出全量类加载日志,定位到死循环中反复加载的具体类,再针对性核查Agent对该类的处理逻辑
  • 检查Agent类加载实现:确认Agent自定义loadClass方法是否正确调用父类逻辑,是否对JDK基础类、Tomcat容器内置类做了增强跳过处理
  • 兼容性验证:将该Agent挂载到普通Java进程运行,如果没有出现该问题,即可确认是Agent与Tomcat类加载器的兼容性问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:48:01