spring中防止内存泄露的监听器—IntrospectorCleanupListener
2014-10-10 12:59
253 查看
今天遇到一个内存泄露的问题:
当时不知道怎么回事,以为是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>
当时不知道怎么回事,以为是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>
相关文章推荐
- spring 监听器 IntrospectorCleanupListener 防止内存泄露
- Spring 刷新Introspector防止内存泄露
- Spring 刷新Introspector防止内存泄露
- Spring配置防止内存泄露
- java 代码优化 优化内存使用 防止内存泄露 优化代码规范 提高效率
- Silverlight - 防止内存泄露:清理ViewModel对View的引用
- 防止内存泄露 Linux下用Valgrind做检查
- Linux下用Valgrind防止内存泄露
- android17——如何防止内存泄露
- 理解new和delete还有就是如何防止内存泄露
- 防止内存泄露 Linux下用Valgrind做检查
- 防止内存泄露 Linux下用Valgrind做检查
- ADO防止内存泄露和减少内存开销的方法
- Java中防止内存泄露
- 防止内存泄露 Linux下用Valgrind做检查
- 防止内存泄露 Linux下用Valgrind做检查
- 防止内存泄露
- 防止内存泄露 Linux下用Valgrind做检查
- 防止内存泄露 Linux下用Valgrind做检查
- java 代码优化 优化内存使用 防止内存泄露 优化代码规范 提高效率