Tomcat重启报Illegal access错误无法加载类,有什么其他解决方法?
Tomcat 重启类加载异常解决方案
该报错本质是Web应用实例已经停止后,仍有残留线程尝试通过已销毁的Webapp类加载器加载类,通常是应用资源未完全释放导致的,除已尝试的操作外,其余可行解决方案如下:
- 清理Tomcat残留缓存:停止Tomcat进程后,删除
work/Catalina/localhost下对应expert项目的缓存目录,同时清空temp目录下的所有临时文件,再重新启动Tomcat即可解决旧类缓存冲突的问题。 - 主动释放应用自定义线程资源:检查项目内的自定义异步线程池、定时任务、消息消费线程等资源,确保在Spring容器销毁时会主动关闭这些线程。Spring项目可以通过
@PreDestroy注解编写销毁逻辑,手动调用线程池的shutdown()方法、停止定时任务,避免残留线程持有旧类加载器的引用。 - 调整JDBC驱动放置路径:如果项目
WEB-INF/lib目录下存放了JDBC驱动包,Tomcat停止时驱动无法正常注销会残留类加载器引用,建议将JDBC驱动包移动到Tomcat全局的lib目录下,也可以在容器销毁逻辑中主动调用DriverManager.deregisterDriver()方法注销对应驱动。 - 关闭Tomcat自动部署功能:除了已配置的
reloadable="false",还需要在Host配置项中把autoDeploy设置为false,避免Tomcat自动检测应用文件变化触发不必要的重载,调整后的Context配置如下:
<Context path="/expert" docBase="expert" debug="0" reloadable="false" autoDeploy="false">
- 调大JVM元空间参数:如果JVM的元空间(JDK8之前为永久代)配置过小,类加载过多无法正常卸载也会触发该异常,可以适当调大JVM启动参数中的
-XX:MaxMetaspaceSize值,比如设置为-XX:MaxMetaspaceSize=512m。
内容的提问来源于stack exchange,提问作者divyanshu gupta
相关产品推荐
相关产品推荐

