but has failed to stop it. This is very likely to create a memory leak(c3p0在Spring管理中,连接未关闭导致的内存溢出)

以下是错误日志信息:

严重: The web application [/news] registered the JDBC driver [com.mysql.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.
2014-12-19 0:27:47 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/news] appears to have started a thread named [C3P0PooledConnectionPoolManager[identityToken->1pyjusp96q571f188m8|18782a7]-AdminTaskTimer] but has failed to stop it. This is very likely to create a memory leak.
2014-12-19 0:27:47 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/news] appears to have started a thread named [C3P0PooledConnectionPoolManager[identityToken->1pyjusp96q571f188m8|18782a7]-HelperThread-#0] but has failed to stop it. This is very likely to create a memory leak.
2014-12-19 0:27:47 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/news] appears to have started a thread named [C3P0PooledConnectionPoolManager[identityToken->1pyjusp96q571f188m8|18782a7]-HelperThread-#1] but has failed to stop it. This is very likely to create a memory leak.
2014-12-19 0:27:47 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/news] appears to have started a thread named [C3P0PooledConnectionPoolManager[identityToken->1pyjusp96q571f188m8|18782a7]-HelperThread-#2] but has failed to stop it. This is very likely to create a memory leak.


堆栈信息:

Exception in thread "C3P0PooledConnectionPoolManager[identityToken->1pyjusp96q571f188m8|18782a7]-AdminTaskTimer" java.lang.NullPointerException
    at com.mchange.v2.log.log4j.Log4jMLog$Log4jMLogger.isLoggable(Log4jMLog.java:293)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector.run(ThreadPoolAsynchronousRunner.java:729)
    at java.util.TimerThread.mainLoop(Timer.java:512)
    at java.util.TimerThread.run(Timer.java:462)



我的情况是在配置数据源时未配置销毁dataSource对象时执行close方法关闭连接

	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
		<property name="driverClass" value="${driverClass}"></property>
		<property name="jdbcUrl" value="${jdbcUrl}"></property>
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>

		<property name="initialPoolSize" value="1"></property>
		<property name="minPoolSize" value="1"></property>
		<property name="maxPoolSize" value="20"></property>
		<property name="maxIdleTime" value="60"></property>
	</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" > 在这里面加入destroy-method="close"

### Java线程能停止导致内存泄漏的原因分析 当Java应用程序中的线程能正常终止时,可能会引发内存泄漏问题。通常情况下,线程持有对对象的引用,如果这些线程不被正确关闭,则它们所持有的资源不会得到释放,从而造成内存占用持续增加。 #### 原因一:守护线程设置不当 将辅助性质的工作线程标记为守护线程(Daemon Thread),这使得即使主线程结束,程序也不会退出,因为JVM会等待非守护线程完成工作[^1]。 #### 解决方案: 确保所有不需要长期运行的任务都在线程启动前通过`setDaemon(true)`方法将其设为守护线程: ```java Thread worker = new Thread(new Runnable() { @Override public void run() { // Task implementation here... } }); worker.setDaemon(true); worker.start(); ``` #### 原因二:静态成员变量持有线程实例 某些类可能拥有指向线程对象的静态字段,在这种情形下,即便该线程已经完成了其生命周期内的全部任务,由于存在来自GC Roots可达路径上的强引用关系,垃圾回收器也无法对该线程及其关联的对象执行清理操作。 #### 解决方案: 避免让线程成为任何具有较长生命期作用域内实体的一部分;对于确实需要保持状态的情况,考虑采用弱引用或其他形式更灵活的引用机制来代替默认的强引用方式处理这类场景下的依赖管理问题。 #### 日志记录与调试技巧 为了更好地定位由线程引起的潜在内存泄露情况,可以利用堆转储文件以及相应的工具来进行深入分析。此外,合理配置日志级别并打印出详细的栈跟踪信息也有助于快速发现问题所在之处。 ```java try { // Your thread code goes here. } catch (Exception e) { logger.error("Unexpected exception occurred", e); } finally{ System.out.println(Thread.currentThread().getStackTrace()); } ``` 上述代码片段展示了如何捕获异常并将完整的调用链路输出至控制台以便后续排查使用。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值