Spring刷新Introspector防止内存泄露
来源:互联网 发布:应聘程序员简历 编辑:程序博客网 时间:2024/05/19 08:41
JavaBeans Introspector是一个类,位置在Java.bean.Introspector,这个类的用途是发现java类是否符合javaBean规范,也就是这个类是不是javabean。具体用法可以参照jdk文档;
上面的意思就是,如果有的框架或者程序用到了JavaBeans Introspector了,那么就启用了一个系统级别的缓存,这个缓存会存放一些曾加载并分析过的javabean的引用,当web服务器关闭的时候,由于这个缓存中存放着这些javabean的引用,所以垃圾回收器不能对web容器中的javaBean对象进行回收,导致内存越来越大。
spring提供的org.springframework.web.util.IntrospectorCleanupListener就解决了这个问题,他会在web服务器停止的时候,清理一下这个Introspector缓存。使那些javabean能被垃圾回收器正确回收。
spring不会出现这种问题,因为spring在加载并分析完一个类之后会马上刷新JavaBeans Introspector缓存,这样就保证了spring不会出现这种内存泄漏的问题。
但是有很多程序和框架在使用了JavaBeans Introspector之后,都没有进行清理工作,比如quartz、struts。
spring中提供了一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器。它主要负责处理由JavaBeans Introspector的使用而引起的缓冲泄露。spring中对它的描述如下:
它是一个在web应用关闭的时候,清除JavaBeans Introspector的监听器.在web.xml中注册这个listener.可以保证在web 应用关闭的时候释放与掉这个web 应用相关的class loader 和由它管理的类
如果你使用了JavaBeans Introspector来分析应用中的类,Introspector 缓冲中会保留这些类的引用.结果在你的应用关闭的时候,这些类以及web 应用相关的class loader没有被垃圾回收.
不幸的是,清除Introspector的唯一方式是刷新整个缓冲.这是因为我们没法判断哪些是属于你的应用的引用.所以删除被缓冲的introspection会导致把这台电脑上的所有应用的introspection都删掉.
需要注意的是,spring 托管的bean不需要使用这个监听器.因为spring它自己的introspection所使用的缓冲在分析完一个类之后会被马上从javaBeans Introspector缓冲中清除掉.
应用程序中的类从来不直接使用JavaBeans Introspector.所以他们一般不会导致内部查看资源泄露.但是一些类库和框架往往会产生这个问题.例如:Struts 和Quartz.
单个的内部查看泄漏会导致整个的web应用的类加载器不能进行垃圾回收.在web应用关闭之后,你会看到此应用的所有静态类资源(例如单例).这个错误当然不是由这个类自身引起的.
在web.xml中添加IntrospectorCleanupListener为web.xml中的第一个Listener,在任何其他Listener之前注册,比如在Spring's ContextLoaderListener注册之前,才能确保IntrospectorCleanupListener在Web应用的生命周期适当时机生效:
<!-- 防止内存泄露 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
- Spring 刷新Introspector防止内存泄露
- Spring 刷新Introspector防止内存泄露
- Spring刷新Introspector防止内存泄露
- Spring配置防止内存泄露
- spring 监听器 IntrospectorCleanupListener 防止内存泄露
- 防止内存泄露
- JAVA防止内存泄露
- Handler防止内存泄露
- Android防止内存泄露
- 内存管理-防止泄露
- 内存泄露防止
- spring中防止内存泄露的监听器—IntrospectorCleanupListener
- Symbian 防止RPointerArray内存泄露
- Java中防止内存泄露
- STL之防止内存泄露
- java细节,防止内存泄露
- Android内存优化防止内存泄露
- 防止C代码内存泄露的方法
- windows下的几种通讯方式之TCP
- Github 笔记
- 链表及操作
- Ubuntu/Linux apache启动、重启、停止操作指令
- [POJ2406] Power Strings
- Spring刷新Introspector防止内存泄露
- MYSQL 更新时间自动同步与创建时间默认值共存问题
- leetcode -- Basic Calculator I &II --重点,未完全理解
- 使用eclipse进行开发时,有时候遇到电脑卡死的解决办法
- 欢迎使用CSDN-markdown编辑器
- 栈的顺序表示和实现
- Objective-C_OC中的方法
- 修改IOS程序名称
- linux select例子