spring中防止内存泄露的监听器—IntrospectorCleanupListener

今天遇到一个内存泄露的问题:


当时不知道怎么回事,以为是tomcat服务器出问题了,就重启了一下,没问题了。但是这样好像并没有解决实质性问题。

所以追根溯源,为什么会出现如上图所述的内存溢出的错误的呢?

原来是spring自身的问题,也就是当tomcat启动的时候,会加载我们web app中相关的一些class loader和由它们加载的一些类;而当我们的web app关闭的时候,并没有清除这些缓存,所以就出现了上述错误。

spring的这个监听器org.springframework.web.util.IntrospectorCleanupListener就是当应用关闭时,刷新jdk中的缓冲(主要是由JavaBeans Introspector引起的),确保那些class loader等被释放掉。

如果这个JavaBeans Introspector被用来分析的是应用类的话,系统级别的Introspector缓冲将持有对那些应用类的一个强引用。因此,当web app关闭的时候,那些类以及web应用的class loader就不会被垃圾回收。

不幸的是,清除Introspector唯一的方式就是会刷新整个缓冲,因为我们无法判断哪些才是你的应用的引用。所以这就会导致清除这台服务器上其他别的应用的缓冲的introspection。



这个监听器应该在web.xml的其他listener(例如ContextLoaderListener)之前注册,这样就会在生命周期的适当的时间完全起作用。

<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值