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