`

关于tomcat总是memory leak问题

 
阅读更多

tomcat的catalina.out日志文件里总是输出

异常如下:

 2012-2-9 17:43:12 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/codeMarket] registered the JBDC 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.
2012-2-9 17:43:12 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/codeMarket] registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
2012-2-9 17:43:12 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/codeMarket] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.
2012-2-9 17:43:12 org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap
严重: The web application [/codeMarket] created a ThreadLocal with key of type [null] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@e1666]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@e0ada6]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
2012-2-9 17:43:12 org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap
严重: The web application [/codeMarket] created a ThreadLocal with key of type [null] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@a8a314]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@16ab2e8]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.

 

http://blog.sina.com.cn/s/blog_4550f3ca0101byg1.html

 

解决方法一:

重写org.apache.commons.dbcp.BasicDataSource  的 close()方法

(继承某datasource,写drivermanager 关闭方法)

在应用程序关闭里手动注销JDBC驱动

 

解决方法二:

写一个应用程序上下文监听器,在contextDestroyed方法中加入如下代码:

DriverManager.deregisterDriver(DriverManager.getDriver(url));

 

如果你不知道url,那就这样:

Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
	Driver driver = drivers.nextElement();
	try {
		DriverManager.deregisterDriver(driver);
		Logger.getLogger(
				this.class.getName())
				.log(Level.INFO,
						String.format("deregistering jdbc driver: %s",
								driver), driver);
	} catch (SQLException e) {
		Logger.getLogger(
				this.class.getName())
				.log(Level.SEVERE,
						String.format("Error deregistering driver %s",
								driver), e);
	}
}

 

BasicDataSource's method close() doesn't deregister JDBC driver. This causes permgen memory leaks in web server environments, during context reloads. For example, using Tomcat 6.0.26 with Spring, and BasicDataSource declared in Spring context, there is a message printed at web application reload:

SEVERE: A web application registered the JBDC 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.

I was able to fix it by overriding close method this way:

public class XBasicDataSource extends BasicDataSource {
    @Override
    public synchronized void close() throws SQLException {
        DriverManager.deregisterDriver(DriverManager.getDriver(url));
        super.close();
    }
}

来源:https://issues.apache.org/jira/browse/DBCP-332

 

关于第二个问题:

created a ThreadLocal with key of type。。。。。This is very likely to create a memory leak.

http://blog.csdn.net/zhuhezan/article/details/6882089

 

但是有一点,关闭后,只是不检查了。问题还是存在那的。怎么感觉像 掩耳盗铃

分享到:
评论

相关推荐

    学习tomcat的内存泄漏

    java -verbose:gc -Xloggc:gc.log -XX:+ PrintGCDetails -jar Learn-tomcat-memory-leak-0.0.1-SNAPSHOT.jar 使用jstat命令观察GC的过程 jstat -gc 94223 2000 1000 通过GCViewer工具查看GC日志 为了找到内存泄漏...

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    本文将详细介绍如何利用 Eclipse Memory Analyzer (MAT) 工具来诊断并解决 Tomcat 服务器上的 Java 应用程序内存溢出问题。 #### 二、内存溢出的原因及处理思路 ##### 2.1 内存泄露 - **定义**:内存泄露是指不再...

    解决tomcat内存溢出的配置方法

    内存溢出(Memory Leak)是这类问题中的常见现象,可能导致服务崩溃,严重影响系统的稳定性和可靠性。本篇将详细介绍如何解决Tomcat内存溢出的问题,以及如何进行相应的配置优化。 首先,我们需要理解什么是内存...

    使用MAT分析Tomcat内存溢出

    在Java开发过程中,Tomcat作为常用的Java应用服务器,有时会遇到内存溢出(Out Of Memory,OOM)的问题,这可能导致应用程序崩溃或者性能急剧下降。内存溢出问题的排查和解决是一项重要的技能。本文将详细讲解如何...

    Tomcat报错: JDBC unregister 解决办法

    To prevent a memory leak, the JDBC Driver has been forcibly unregistered. ``` 这里,`[web application]`是你的应用名称,`[net.sourceforge.jtds.jdbc.Driver]`是具体的JDBC驱动类名。 解决这个问题有以下...

    Web_Leak:TDC 2018演示项目-Java Enterprise Track

    将生成两种类型的遏制: 1- Memory Leak 2- Contenção em Threads一般说明因为它是一个非常简单的Web项目,所以只需上载您选择的容器(Jboss,Tomcat等)并部署该项目即可。 选择容器后,添加引用Web模块...

    tomcat6.0 /7.0安装版内存溢出设置方法

    首先,内存溢出(Memory Leak)通常是因为分配的内存超出了系统可用的内存,或者内存资源无法得到正确释放,导致应用无法正常运行。Tomcat作为Java应用服务器,其Java虚拟机(JVM)分配内存的参数需要特别设置,以...

    Eclipse内存溢出

    内存溢出(Memory Leak)是指程序运行过程中使用的内存超过系统所能提供的最大内存限制时所出现的问题。这种情况通常发生在Java等需要进行垃圾回收的语言中。当应用程序创建的对象没有被适当地释放或回收时,就会...

    mat监控工具使用总结

    MAT提供了丰富的视图和分析功能,如Dominator Tree、Leak Suspects、Object Histogram等,以帮助开发者快速定位内存问题。 #### 2.1. MAT是什么? MAT是一个开源的Java内存分析工具,它能帮助开发者分析Java应用的...

    JAVA性能瓶颈和漏洞检测.JProbe.Suite.v7.0.part2

    智能化内存分析:通过Leak Doctor发现可能的内存泄露源; Aggregate Memory Footprint:理解对象创建的实际开销; Reference Graph 和 Instance Detail:跟踪内存使用和对象引用; 垃圾回收分析:检测过多的短期...

    JAVA性能瓶颈和漏洞检测

    智能化内存分析:通过Leak Doctor发现可能的内存泄露源; Aggregate Memory Footprint:理解对象创建的实际开销; Reference Graph 和 Instance Detail:跟踪内存使用和对象引用; 垃圾回收分析:检测过多的短期...

    JVisualVM简介与内存泄漏实战分析

    内存溢出(Memory Leak)是指程序在申请内存后未能释放已经不再使用的内存,导致随着时间推移,可用内存越来越少,最终导致程序或整个系统崩溃的情况。JVisualVM提供了多种工具来帮助开发者定位和解决这类问题。 ##...

    JAVA性能瓶颈和漏洞检测].JProbe.Suite.v7.0.part1

    智能化内存分析:通过Leak Doctor发现可能的内存泄露源; Aggregate Memory Footprint:理解对象创建的实际开销; Reference Graph 和 Instance Detail:跟踪内存使用和对象引用; 垃圾回收分析:检测过多的短期...

    mat工具测试类

    5. ** Leak Suspects 报告**:MAT会自动生成一份疑似内存泄漏的报告,列出可能导致问题的最可能原因。 在“mat工具测试类”中,我们通常会创建模拟场景,故意触发`OutOfMemoryError`,以便生成heap dump文件,然后...

    专题资料(2021-2022年)java面试题知识点总结.doc

    内存泄露(Memory Leak)是指程序在申请内存后,无法释放已不再使用的内存空间,久而久之会导致可用内存耗尽。 JVM内存分为7个区域:程序计数器、虚拟机栈、本地方法栈、堆、方法区、元空间(或永久代)以及直接...

    JProfiler Helper

    **Finding a Memory Leak (A.2.3)** Detecting and fixing memory leaks is critical for maintaining long-term application stability. Key steps include: - Identifying objects that are retained longer than...

Global site tag (gtag.js) - Google Analytics