`
lumingming1987
  • 浏览: 116716 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring 刷新Introspector防止内存泄露

 
阅读更多

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中添加:

<!-- 防止内存泄露 -->   
<listener>   
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>   
</listener>

分享到:
评论

相关推荐

    Spring的web配置

    springmvc的资源配置:Spring 刷新Introspector防止内存泄露,Spring MVC配置;Character Encoding filter; &lt;param-name&gt;contextConfigLocation &lt;param-value&gt;classpath*:applicationContext-*.xml ...

    springMVC学习笔记

    -- Spring刷新Introspector防止内存泄露 --&gt; &lt;listener-class&gt;org.springframework.web.util.IntrospectorCleanupListener ``` `IntrospectorCleanupListener`会在应用启动和关闭时执行清理操作,确保不会因为...

    Spring源码学习十三:IntrospectorCleanupListener解析1

    这个类在Spring源码中扮演着一个重要的角色,主要目的是解决与`Introspector`相关的内存泄漏问题。首先,我们需要理解`Introspector`在Java中的作用。 `Introspector`是Java标准库`java.beans`包下的一个类,它的...

    JAVA的内省机制(introspector)与反射机制(reflection).docx

    "JAVA的内省机制(introspector)与反射机制(reflection)" JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们...

    struts2+hibernate+spring

    - **Spring Introspector清理Listener**:用于清理Spring中的元数据信息,防止内存泄漏。 综上所述,通过将Struts2、Hibernate和Spring框架进行整合,不仅可以充分利用每个框架的特点,还可以实现更高效、更灵活的...

    Xfire+spring整合的开发实例.doc

    `ContextLoaderListener`监听器负责在服务器启动时加载Spring上下文,而`IntrospectorCleanupListener`则是用来清理JavaBean introspector,避免内存泄漏。 接下来是XFire的配置。我们定义了一个名为`xfire`的...

    Java 内省introspector相关原理代码解析

    例如,`Introspector.getBeanInfo(Class)` 方法可以获取指定类的BeanInfo,这包含了关于类的属性(PropertyDescriptor)、事件(EventSetDescriptor)和方法(MethodDescriptor)等信息。 在提供的代码示例中,`...

    使用struts2的Introspector做日志

    在Struts2中,Introspector是一个核心组件,用于检查和获取Action类的属性,这对于实现诸如日志记录、数据验证等任务非常有用。这篇博客文章可能探讨了如何利用Struts2的Introspector来实现日志功能。 日志在软件...

    SSH详细配置文件(自己个人经验)

    - **IntrospectorCleanupListener**:防止Introspector引起的内存泄漏。 - **CharacterEncodingFilter**:设置请求编码为GBK,确保中文等多语言支持。 - **Hibernate OpenSessionInViewFilter**:开启事务,确保...

    将_Shiro_作为应用的权限基础_五:SpringMVC+Apache_Shiro+JPA(hibernate)整合配置

    - **IntrospectorCleanupListener**:这是一个Spring提供的监听器,用于防止`java.beans.Introspector`类引发的内存泄漏问题。将其配置在`ContextLoaderListener`之前可以确保先清理再初始化Spring容器。 - **...

    java-beans-lite:轻量级且快速的java.beans.Introspector实现

    由于它与AWT的紧密依赖,因此无法轻易将其从java.desktop模块中删除,从而导致任何使用java.beans包的第三方库都依赖于所有java.desktop类,从而在JVM安装中增加了12mb的额外开销,并且一些额外的内存使用情况。...

    Python库 | plone.introspector-0.1.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:plone.introspector-0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    用反射和内省技术实现简单SpringIOC

    在Java编程中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)容器之一。本篇文章将深入探讨如何利用反射和内省技术来实现一个简单的Spring IOC。首先,...

    Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.zip)

    Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.zip) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...

    Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.tar.gz)

    Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.tar.gz) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...

    S2SH的配置

    - **`IntrospectorCleanupListener`**:用于清理JavaBeans Introspector缓存,防止内存泄漏问题。 ### 2.2 Hibernate配置 为了实现事务的一致性,通常会在`web.xml`中配置一个过滤器,用以开启Session的生命周期与...

    tajin-framework-all-2.22.zip

    此次我们关注的是一款名为"Tajin Framework All 2.22"的压缩包,其中包含了名为"app-introspector.zip"的Spring插件。这个插件是一个强大的工具,专为在运行时诊断和检查Spring Bean而设计,其核心功能是通过JSON...

    Java 内省(Introspector)深入理解

    Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...

    RDF Software Introspector-开源

    Introspector使处理源代码的编程工具(例如编译器)能够以标准且中立的方式进行通信,从而减少了意外的编程成本。 http://github.com/h4ck3rm1k3/

Global site tag (gtag.js) - Google Analytics