您的位置:首页 > 编程语言 > Java开发

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

2014-10-10 12:59 225 查看
今天遇到一个内存泄露的问题:



当时不知道怎么回事,以为是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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: