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

来源:互联网 发布:淘宝官方网电话是多少 编辑:程序博客网 时间:2024/06/05 01:03

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


当时不知道怎么回事,以为是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>

0 0
原创粉丝点击