全网整合营销服务商

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

免费咨询热线: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路径拼接规范_跨平台处理说明【指导】  七夕网站制作视频,七夕大促活动怎么报名?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  公司门户网站制作流程,华为官网怎么做?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  建站之星如何实现PC+手机+微信网站五合一建站?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  高防服务器租用首荐平台,企业级优惠套餐快速部署  ,石家庄四十八中学官网?  如何挑选优质建站一级代理提升网站排名?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  网站制作员失业,怎样查看自己网站的注册者?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  建站org新手必看:2024最新搭建流程与模板选择技巧  ,在苏州找工作,上哪个网站比较好?  如何在IIS中新建站点并配置端口与IP地址?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  建站主机选择指南:服务器配置与SEO优化实战技巧  微信小程序 五星评分(包括半颗星评分)实例代码  如何获取PHP WAP自助建站系统源码?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  如何在阿里云购买域名并搭建网站?  如何使用Golang安装API文档生成工具_快速生成接口文档  如何在阿里云虚拟服务器快速搭建网站?  宁波自助建站系统如何快速打造专业企业网站?  如何登录建站主机?访问步骤全解析  建站之星客服服务时间及联系方式如何?  建站之星CMS五站合一模板配置与SEO优化指南  如何在宝塔面板创建新站点?  建站之星各版本价格是多少?  北京制作网站的公司,北京铁路集团官方网站?  如何在局域网内绑定自建网站域名?  如何高效完成独享虚拟主机建站?  建站主机选哪家性价比最高?  建站之星官网登录失败?如何快速解决?  c++怎么用jemalloc c++替换默认内存分配器【性能】  建站主机服务器选购指南:轻量应用与VPS配置解析  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何快速查询网址的建站时间与历史轨迹?  建站之星如何优化SEO以实现高效排名?  如何选择高效响应式自助建站源码系统?  如何用虚拟主机快速搭建网站?详细步骤解析  已有域名和空间,如何快速搭建网站? 

您的项目需求

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