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小时内与您取得联系。