Tomcat This is very likely to create a memory leak. Stack trace of thread 错误分析

1、问题描述

启动tomcat部署项目时,报This is very likely to create a memory leak. Stack trace of thread错误。

29-May-2018 12:30:09.322 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more Filters failed to start. Full details will be found in the appropriate container log file
29-May-2018 12:30:09.323 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
29-May-2018 12:30:09.427 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
29-May-2018 12:30:09.427 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] 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.
29-May-2018 12:30:09.428 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [org.h2.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
29-May-2018 12:30:09.428 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
 com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:64)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)

2、问题原因

tomcat启动奔溃,同时释放了jdbc连接。

3、解决方案

这种异常造成的原因千奇百怪,并没有统一的处理方案,以下是我遇到的不同情况采取的几种解决方案。

3.1、存在多个tomcat子线程

启动前tomcat意外退出,使用ps -ef | grep "tomcat名称"查看是不是有多个tomcat在启动,若有,Kill掉。

3.2、调整JVM参数

JAVA_OPTS='-server -Xms5120m -Xmx10240m -XX:PermSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=5120m '

3.3、去掉tomcat监听

tomcat 6.025以后引入了内存泄露侦测,对于垃圾回收不能处理的对像,它就会做日志。去掉监听的方法也很简单:
在tomcat的server.xml文件中,把
<!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>这个监听给关了。

3.4、其他
如果以上方案无法解决问题,只能逐步排查,排查方案如下:
1.使用“之前部署正常的分支”(我们记为hoaven分支)部署项目;
2.若tomcat能正常启动,说明tomcat或服务器没有问题,检查自己的代码;
3.逐步检查自己的代码:从hoaven分支checkout一个分支(fixbug),然后将自己写的代码一点一点移至fixbug分支。
4.每移动一次代码,部署一次,若正常启动,继续移动代码;若报出以上错误,停止移动,检查本次移动的代码。

其实3.4方法很有效,特别是检查肉眼无法明了的莫名其妙的的bug。

记录下我某一次检查以上bug采用的3.4方案,得出的结果:
代码中,有一处注入报错很奇怪:

@Slf4j
@Component
public class RestAuthFilter extends FormAuthenticationFilter {

    @Resource
    MobileDeviceService mobileDeviceService;

    @Resource
    UserService userService;
    
    ...
}


@Slf4j
@Service
public class MobileDeviceServiceImpl implements MobileDeviceService {
    @Resource
    IHddBaseService hddBaseService;
    
    ...
}

MobileDeviceServiceUserService上的@Resource改为@Autowired部署则没有问题,思考一下:@Resource属于jdk的注解,@Autowired属于spring的注解,应该是注入RestAuthFilter时,在spring容器中没有找到MobileDeviceService和UserService的实例,@Resource会强制将MobileDeviceServiceUserService注入进来,而@Autowired采取的措施是不注入(或注入null)。这样一来,就会有新的问题,MobileDeviceServiceUserService实例为null,解决方案在后面的博客解决。

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这句话的意思是“但是未能停止它。这很可能会导致内存泄漏。线程的堆栈跟踪如下:”。它的含义可能是在讨论某种程序或代码的执行过程中出现了问题,导致程序未能正确地停止,这可能会导致内存泄漏。而“线程的堆栈跟踪”指的是记录了程序在执行过程中的函数调用路径和变量状态等信息的一种数据结构。 ### 回答2: 首先,我们需要理解两个概念:memory leak内存泄漏)和stack trace(堆栈跟踪)。内存泄漏指的是程序在使用内存时,没有将无用的内存释放,导致程序的内存占用不断增加,最终导致程序崩溃。堆栈跟踪则是指在程序崩溃时,记录下引起崩溃的代码调用堆栈信息,以便进行排查问题。 根据题目中的描述,程序尝试停止某个操作,但未能成功,这很可能会导致内存泄漏。造成内存泄漏的原因可能是程序在执行该操作过程中申请了内存,但未能及时释放,导致内存不断增加。如果程序无法停止该操作,内存泄漏的情况将持续下去,最终导致程序崩溃。 程序崩溃后,堆栈跟踪会记录下导致崩溃的代码调用堆栈信息。通过分析堆栈跟踪,我们可以确定程序崩溃的原因,并且尝试修复问题。 总之,内存泄漏和堆栈跟踪是程序开发和调试中非常重要的概念,程序员需要时刻关注它们,以确保程序的稳定性和可靠性。 ### 回答3: 这个问题主要是关于内存泄漏的。内存泄漏是指程序中分配的内存一直没有被释放,最终导致系统内存不足、程序崩溃或者系统变慢的问题。而这个错误信息:“but has failed to stop it. this is very likely to create a memory leak. stack trace of thread:。”正告诉我们,程序尝试去终止某个操作,但是没有成功,这可能会导致内存泄漏,并给出了线程的堆栈跟踪信息。我们需要进一步分析并解决这个问题。 首先,我们需要查看这个线程堆栈跟踪信息,以了解该线程当前正在执行哪些操作,以及该操作是否涉及到内存管理问题。我们需要分析代码,找到这个操作的根本原因并进行修复。 其次,我们需要检查代码中的内存管理方法,并确认程序是否正在释放分配的内存,以避免内存泄漏。我们可以使用内存监视器等工具来检查程序运行时的内存使用情况,并及时发现和解决内存泄漏问题。 最后,我们还需要注意在程序设计和实现时尽可能减少内存使用,例如避免重复开辟内存空间、及时释放不需要的内存等,以优化程序的性能和稳定性。 总之,解决内存泄漏问题需要我们从代码中入手,分析和修复程序中可能存在的内存管理问题,以及优化程序的内存使用,从而提高程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值