全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Tomcat 检测内存泄漏实例详解

 Tomcat如何检测内存泄漏

一般情况下,如果我们重启web应用是通过重启tomcat的话,则不存在内存泄漏问题。但如果不重启tomcat而对web应用进行重加载则可能会导致内存泄漏,因为重加载后有可能会导致原来的某些内存无法让GC回收,例如web应用使用了JDBC,驱动会进行注册,当web应用停止时没有反注册就会导致内存泄漏。

看看是什么原因导致tomcat内存泄漏的。这个要从热部署开始说起,因为tomcat提供了不必重启容器而只需重启web应用以达到热部署的功能,其实现是通过定义一个WebappClassLoader类加载器,当热部署时就将原来的类加载器废弃并重新实例化一个WebappClassLoader类加载器。但这种方式可能存在内存泄漏问题,因为ClassLoader是一个结构复杂的对象,导致它不能被GC回收的可能性比较多,除了对ClassLoader对象有引用可能导致其无法回收,还可能对其加载的元数据(方法、类、字段等)有引用都会导致无法被GC回收。

如上图,tomcat的资源由不同类加载器加载,这里只看BootstrapClassLoader和WebappClassLoader两个类加载器,BootstrapClassLoader负责加载rt.jar包的Java.sql.DriverManager,WebappClassLoader负责加载web应用中的MySQL驱动包,其中有一个很重要的步骤是mysql的驱动类需要注册到DriverManager中,即DriverManager.registerDriver(new Driver()),它由mysql驱动包自动完成。这样一来当web应用进行热部署操作时,没有将mysql的Driver从DriverManager中反注册掉的话,则会导致整个WebappClassLoader回收不了,造成内存泄漏。

接着看tomcat如何对此内存泄漏进行监控的,要判断WebappClassLoader会不会导致内存泄漏只需判断WebappClassLoader有没有被GC回收即可。在Java中有一种引用叫弱引用,它能很好判断WebappClassLoader有没有被GC回收,被弱引用关联的对象只能生存到下一次垃圾回收发生之前,即如果某WebappClassLoader对象只被某弱引用关联,则它会在下次垃圾回收时被回收,但如果WebappClassLoader对象除了被弱引用关联外还被其他对象强引用,那么WebappClassLoader对象是不会被回收的,根据这些条件就可以判断是否有WebappClassLoader内存泄漏了。

Tomcat的实现是通过WeakHashMap来实现弱引用的,只需将WebappClassLoader对象put到WeakHashMap中,例如weakMap.put(“a”,webappClassLoader),当webappClassLoader及其包含的元素没有被其它任何类加载器中的元素引用到时,JVM发生垃圾回收时则会把webappClassLoader对象回收。

简单的实现代码大致如下:

public class MemoryLeakTest{
private Map<ClassLoader, String> childClassLoaders = new WeakHashMap<ClassLoader, String>();
public String[] findReloadedContextMemoryLeaks() {
    System.gc();
    List<String> result = new ArrayList<String>();
    for (Map.Entry<ClassLoader, String> entry : childClassLoaders.entrySet()) {
      ClassLoader cl = entry.getKey();
      if (!((WebappClassLoader) cl).isStarted()) {
        result.add(entry.getValue());
      }
    }
    return result.toArray(new String[result.size()]);
  }
}

使用一个WeakHashMap用于跟踪WebappClassLoader,在查找内存泄漏之前会先强制调用System.gc();进行一次垃圾回收,保证没问题的WebappClassLoader都被回收掉,这时如果还有WebappClassLoader的状态是非started(正常启动的都为started,关闭了的则为非started)的,则是未被垃圾回收的WebappClassLoader,属于内存泄漏的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Tomcat如何检测内存泄漏  # Tomcat检测内存泄漏详解  # 详解如何通过tomcat的ManagerServlet远程部署项目  # servlet和tomcat_动力节点Java学院整理  # tomcat中Servlet对象池介绍及如何使用  # tomcat中Servlet的工作机制详细介绍  # Tomcat报错:HTTP Status 500 (Wrapper cannot find serv  # tomcat报错:Wrapper cannot find servlet class ...问题解决  # Spring关闭Tomcat Servlet容器时内存泄漏问题解决方案  # 加载  # 重启  # 只需  # 是一个  # 就会  # 很好  # 则是  # 中有  # 会不会  # 对其  # 希望能  # 不存在  # 很重要  # 时就  # 会把  # 谢谢大家  # 只看  # 则可  # 它能  # 而对 


相关文章: 香港服务器网站卡顿?如何解决网络延迟与负载问题?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Python多线程使用规范_线程安全解析【教程】  c# await 一个已经完成的Task会发生什么  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  建站为何优先选择香港服务器?  c# 在高并发场景下,委托和接口调用的性能对比  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  代刷网站制作软件,别人代刷火车票靠谱吗?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  如何挑选最适合建站的高性能VPS主机?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  微信小程序制作网站有哪些,微信小程序需要做网站吗?  常州企业网站制作公司,全国继续教育网怎么登录?  如何用低价快速搭建高质量网站?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  小型网站建站如何选择虚拟主机?  如何在Windows环境下新建FTP站点并设置权限?  如何在腾讯云服务器快速搭建个人网站?  建站主机功能解析:服务器选择与快速搭建指南  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  建站主机数据库如何配置才能提升网站性能?  行程制作网站有哪些,第三方机票电子行程单怎么开?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  广州商城建站系统开发成本与周期如何控制?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  如何彻底卸载建站之星软件?  建站主机默认首页配置指南:核心功能与访问路径优化  实例解析angularjs的filter过滤器  动图在线制作网站有哪些,滑动动图图集怎么做?  香港服务器WordPress建站指南:SEO优化与高效部署策略  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  制作网站公司那家好,网络公司是做什么的?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何用PHP工具快速搭建高效网站?  电商平台网站制作流程,电商网站如何制作?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  建站VPS能否同时实现高效与安全翻墙?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  历史网站制作软件,华为如何找回被删除的网站?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何选择建站程序?包含哪些必备功能与类型? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。