1、原因
驱动程序不会被取消注册,这反过来会阻止您的Web应用程序类.这有效地造成了内存泄漏.
为防止此特定内存泄漏,您应编辑tomcat/conf/server.xml并更改
1、原因
它是JDBC的设计。第一次创建数据库连接时,webapp会加载并注册JDBC驱动程序,这意味着驱动程序加载了Web应用程序类加载器。
在取消部署时,驱动程序不会被取消注册,驱动程序不会被取消注册,这反过来会阻止Web应用程序类,这一点造成了内存泄漏。
所以,为防止此特定内存泄漏,我们应编辑tomcat/conf/server.xml并更改(在Tomcat的根目录中更改即可)
2、解决办法
将原来的代码:
<listener classname="org.apache.catalina.core.JreMemoryLeakPreventionListener">
</listener>
更改为:
<listener classname="org.apache.catalina.core.JreMemoryLeakPreventionListener" classestoinitialize="com.mysql.jdbc.NonRegisteringDriver">
</listener>
即可。
3、为什么要修改server.xml?
由于MySQL的“被遗弃的连接清理线程”,另一个内存泄漏显现,该线程从第一个请求开始,并保存对webapp的类加载器的引用,随着classesToInitialize就可以防止这种内存泄漏了。
4、另一种原因就是如果你使用的是Mybatis的话,在访问数据库的方法中,打开了SqlSession会话而没有及时用sqlSession.close();关闭
public Goods load(String bid) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSession();
// 通过反射获取接口GoodsMapper的Class对象
// 赋给实现了该接口的类(GoodsMapper)的对象(goodsMapper),以此来调用已经被实现的sql方法。
GoodsMapper goodsMapper = sqlSession.getMapper(GoodsMapper.class);
/*
* 通过数据库查找到bid所属商品的详细信息,以一个map作为结果返回
* 再封装到goods对象中
*/
Map<String, Object> map = goodsMapper.findByBid(bid);
Goods goods = CommonUtils.toBean(map, Goods.class);
/*
* 因为默认goods的pojo类中没写cid,只写了一个Category对象
* 所以再封装成Category对象,只是要其中的cid而已
*/
Category category = CommonUtils.toBean(map, Category.class);
// 将二者建立联系
goods.setCategory(category);
// 把pid获取出来,创建一个Category parent,把pid赋给他,再把parent赋给category
if (map.get("pid") != null) {
Category parent = new Category();
parent.setCid((String) map.get("pid"));
category.setParent(parent);
}
sqlSession.close(); // 注意要在方法最后这里关闭sqlSession,不然会有很多问题
// 返回查到的单个商品对象
return goods;
}
希望能帮助你解决类似问题~