TongWeb上反复重部署应用后异常:application instance has been stopped already 或OutOfMemoryError:Metaspace

本文介绍了在TongWeb中反复部署应用导致的问题及其原因,并提供了正确的解决方法,包括如何在listener或servlet的destroy方法中正确地释放资源,以及临时解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题现象:

在不重启TongWeb的情况下,在TongWeb控制台反复部署应用。会导致TongWeb日志报错如下:

java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [redis.clients.util.Pool]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.

或:OutOfMemoryError:Metaspace,  OutOfMemoryError:PermGen space

或:The web application [testdb] registered the JDBC driver [com.mysql.cj.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

问题原因:

应用经常会启动一些端口或线程,在应用服务器上卸载、反复部应用时,若应用代码写的不规范,就不能正常停止应用建的线程,导致应用卸载不干净。 老应用未停止线程加载类报此异常:this web application instance has been stopped already。  同时会导致不能卸载class,反复加载class导致元数据区不足报OutOfMemoryError:Metaspace。

正确的解决方法:

TongWeb的重部署reload实际操作就是对应用重新stop又start了一下,而这个过程除了class的重新加载以外,对于web.xml中定义的一些资源,如listener,filter,servlet等也重新stop又start了。 所以这时需要在listener或servlet的destory中停止应用启动的端口或线程,这样应用服务器在stop应用时,会调用listenerservletdestory方法,从而可以销毁应用创建的资源。而很多应用却忽略了这一点。

如:重写listener   contextDestroyed方法,该卸载的卸载。实际应用常用spring初始化,注意将spring资源关闭。

#重写listener contextDestroyed()方法
public void contextDestroyed(ServletContextEvent arg0) {
   // 停止应用的端口
   //停止应用的线程
}
#重写servlet destroy()方法
public void destroy() {  
   // 停止应用的端口
   //停止应用的线程
}
#典型的场景就是启动了quartz线程池。无关闭quartz线程池步骤,则重部署一次应用,线程池就多增加一份。
<bean id="SpringQtzJobMethod"  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">


#通过annotation关闭实例
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;
 
@Component
public class Test{
	public Test(){
		System.out.println("test constructor...");
	}
	
	//对象创建并赋值之后调用
	@PostConstruct
	public void init(){
		System.out.println("test....@PostConstruct...");
	}
	
	//容器移除对象之前
	@PreDestroy
	public void detory(){
		System.out.println("test....@PreDestroy...");
	}
 
}

临时解决办法:

在修改不了应用的前提下,只要重部署了应用,就需要重启TongWeb释放无用的线程和Metaspace区内存,否则多次重部署后还会报该异常。 增大-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m参数只能缓解 OutOfMemoryErrorMetaspace出现的频率。

同时引申出另外一个问题:在不重启TongWeb的情况下,能否动态更新应用、在线升级应用版本?

答:实际场景下往往不能这样用,原因同上,很多应用不在卸载时执行应用资源关闭操作。这样导致TongWeb的热部署功能、应用版本在线更新功能基本不可用。

若重部署应用不重启TongWeb通常会引发以下三类问题:

(1) 容易导致内存溢出,报错如下:

     #JDK7及以下

     OutOfMemoryError:PermGen space

     #JDK8及以上

     OutOfMemoryErrorMetaspace

(2) 应用启动的端口占用报错:address has been used。

(3) 线程不断增加,而不释放报错:this web application instance has been stopped already。

(4)  反复加载动态库,报错:UnsatisfiedLinkError Native Library xxx.so already loaded。  https://blog.csdn.net/realwangpu/article/details/109554060

### 关于 TongWeb5 中 PWC2786 错误的原因分析 PWC2786 错误通常表明在尝试调用 `removeAttribute` 方法时,会话(session)已经被销毁失效。这种问题可能由多种因素引起,包括但不限于以下几种情况: #### 1. **会话超时** 如果用户的会话由于长时间未活动而被自动销毁,则后续对该会话的操作可能会触发此错误。TongWeb 的默认会话超时时长可以通过配置文件调整[^3]。 #### 2. **手动销毁会话** 某些情况下,程序逻辑可能导致显式调用了 `invalidate()` 方法来销毁当前会话。一旦会话被销毁,任何进一步的属性操作都会引发该异常[^4]。 #### 3. **多线程竞争条件** 当同一会话在同一时间被多个请求访问并修改时,可能出现竞态条件。例如,在一个线程中销毁了会话,而在另一个线程中仍然试图对其进行读写操作[^5]。 --- ### 解决方案 以下是针对上述原因的具体解决方法: #### 配置会话管理参数 通过设置启动脚本来控制会话的行为。例如,可以启用共享会话功能以减少因频繁创建和销毁会话而导致的问题: ```bash -DSharedSessionContext=true -DSharedSessionEnable=true ``` 这将允许不同应用程序之间共享同一个会话实例,从而降低会话无效化的可能性[^1]。 #### 调整会话超时时间 检查并适当延长 Tomcat TongWeb 的会话超时时间。可以在 `web.xml` 文件中定义全局范围内的会话过期策略: ```xml <session-config> <session-timeout>30</session-timeout> <!-- 单位为分钟 --> </session-config> ``` 对于特定的应用场景,也可以动态设定会话的有效期限: ```java HttpSession session = request.getSession(); session.setMaxInactiveInterval(1800); // 设置最大不活跃时间为 1800 秒 (即 30 分钟) ``` #### 修改代码逻辑避免复操作 确保不会多次调用 `invalidate()` 方法者在已经无效化后的会话上执行额外的方法调用。例如,在删除某个会话属性之前先验证其有效性: ```java if (session != null && !session.isNew() && session.getAttribute("attributeName") != null) { session.removeAttribute("attributeName"); } ``` 此外,应尽量避免跨线程共享单一会话对象,除非采取同步机制保护数据一致性[^5]。 #### 日志排查与调试工具 利用日志记录定位具体发生位置,并结合性能监控工具找出潜在瓶颈所在。开启详细的跟踪模式可以帮助快速发现问题根源: ```properties org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true ``` --- ### 总结 综上所述,PWC2786 错误主要是因为非法访问了一个已被标记为无效的状态下的 HTTP 会话所引起的。通过对服务器端参数优化以及改进客户端交互流程能够有效缓解此类现象的发生频率][^[^34]. ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值