`

防止Spring内存泄漏 —— IntrospectorCleanupListener监听器

阅读更多
功能:防止Spring内存泄漏

增加方式如下:
    <listener>
        <listener-class>
            org.springframework.web.util.IntrospectorCleanupListener
        </listener-class>
    </listener>


spring的说明如下:
引用
Listener that flushes the JDK's JavaBeans Introspector cache on web app shutdown. Register this listener in your web.xml to guarantee proper release of the web application class loader and its loaded classes.

If the JavaBeans Introspector has been used to analyze application classes, the system-level Introspector cache will hold a hard reference to those classes. Consequently, those classes and the web application class loader will not be garbage-collected on web app shutdown! This listener performs proper cleanup, to allow for garbage collection to take effect.

Unfortunately, the only way to clean up the Introspector is to flush the entire cache, as there is no way to specifically determine the application's classes referenced there. This will remove cached introspection results for all other applications in the server too.

Note that this listener is not necessary when using Spring's beans infrastructure within the application, as Spring's own introspection results cache will immediately flush an analyzed class from the JavaBeans Introspector cache and only hold a cache within the application's own ClassLoader. Although Spring itself does not create JDK Introspector leaks, note that this listener should nevertheless be used in scenarios where the Spring framework classes themselves reside in a 'common' ClassLoader (such as the system ClassLoader). In such a scenario, this listener will properly clean up Spring's introspection cache.

Application classes hardly ever need to use the JavaBeans Introspector directly, so are normally not the cause of Introspector resource leaks. Rather, many libraries and frameworks do not clean up the Introspector: e.g. Struts and Quartz.

Note that a single such Introspector leak will cause the entire web app class loader to not get garbage collected! This has the consequence that you will see all the application's static class resources (like singletons) around after web app shutdown, which is not the fault of those classes!

This listener should be registered as the first one in web.xml, before any application listeners such as Spring's ContextLoaderListener. This allows the listener to take full effect at the right time of the lifecycle.


其中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开发指南——中文版

    《Spring开发指南——中文版》是由夏昕编著的一本针对Spring框架的中文教程,旨在帮助开发者更好地理解和应用Spring框架。Spring是Java平台上的一个核心框架,广泛应用于企业级应用开发,提供了一种全面的编程和配置...

    Spring技术内幕——深入解析Spring架构与设计 (揭秘系列丛书) - 计文柯.mobi

    Spring技术内幕——深入解析Spring架构与设计 (揭秘系列丛书) - 计文柯.mobi

    二、Spring源码分析——BeanFactory

    《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...

    三、Spring源码分析——ApplicationContext

    《Spring源码分析——ApplicationContext》 在Java世界中,Spring框架是不可或缺的一部分,它以其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)特性,极大地...

    Spring 入门案例——AOP

    - 类加载时织入:使用特殊的类加载器,在目标类被加载到内存时进行织入。 - 运行时织入:在Spring容器启动时动态地将切面织入到代理对象中。 5. **自动代理(Auto Proxy)**:Spring AOP默认使用Java动态代理或...

    spring源码阅读——1.spring-core-3.2.9

    《深入解析Spring Core 3.2.9》 在深入探讨Spring Core 3.2.9之前,我们先理解一下Spring框架的核心概念。Spring作为Java领域最广泛应用的框架之一,其核心组件包括依赖注入(Dependency Injection,DI)、AOP...

    Spring————面试题库

    ApplicationContext在BeanFactory的基础上提供了额外的功能,比如国际化文本消息的支持、统一资源文件的读取方式以及监听器中注册的bean事件等。 Spring提供了三种配置方式:基于XML的配置、基于注解的配置和基于...

    最简单的 SpringCloud 教程——服务的注册与发现(Eureka)

    在本教程中,我们将深入探讨SpringCloud的核心组件之一——Eureka,它是一个服务注册与发现的工具,使得微服务架构中的各个服务能够互相找到并进行通信。我们将通过两个主要步骤来学习如何使用Eureka:创建服务注册...

    JavaEE精讲之Spring框架实战 ——学习笔记.zip

    在本学习笔记中,我们将深入探讨JavaEE中的Spring框架,这是一个强大的、全面的企业级应用程序开发框架,它简化了Java开发并提供了丰富的功能。Spring的核心特性包括依赖注入(DI)、面向切面编程(AOP)以及对Java ...

    京东T5级大牛带你解读Spring核心源码——1小时手写SpringMVC~

    通过本教程的学习,我们不仅了解了Spring框架的核心概念及其在Web开发中的应用——Spring MVC,还手动实现了Spring MVC的基本功能。这种从理论到实践的学习过程有助于加深对Spring框架的理解,并提高实际项目的开发...

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

    `IntrospectorCleanupListener`是Spring框架为了进一步防止这种内存泄漏而设计的一个监听器,它实现了`ServletContextListener`接口。在Web应用启动时,`contextInitialized()`方法会被调用;而在Web应用关闭时,`...

    详解SpringCloudGateway内存泄漏问题

    Spring Cloud Gateway 内存泄漏问题分析与解决 Spring Cloud Gateway 是一个基于 Spring Boot 和 Spring WebFlux 构建的API gateway,提供了丰富的路由、负载均衡、熔断、限流、认证等功能。但是在实际应用中,可能...

    Spring boot通过HttpSessionListener监听器统计在线人数的实现代码

    在Spring boot中通过HttpSessionListener监听器统计在线人数是一种常见的技术实现方式,适用于需要跟踪和管理用户会话状态的Web应用程序。以下是从给定文件中提炼的关键知识点。 首先,了解HttpSessionListener接口...

    Spring特性——事件驱动模型

    在Spring框架中,事件驱动模型主要由三部分组成:事件(Event)、事件监听器(EventListener)和事件发布者(EventPublisher)。当某个组件发生特定事件时,它会创建一个事件对象并将其发布给感兴趣的监听器,这些...

    Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf

    这份文档名为《Java EE 框架整合开发入门到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf》,它显然是关于Java EE中流行的三个框架整合使用的教程。这三个框架分别是Spring、Spring MVC和MyBatis,...

    SpringIoC的简单实现

    【SSH进阶之路】一步步重构容器实现Spring的IoC——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】一步步重构容器实现Spring的IoC——工厂+反射+配置文件实现IoC容器(十)

    Spring系列——MVC框架整合.md

    Spring系列——MVC框架整合.md

    web学习笔记 —— 监听器

    在深入理解监听器的工作原理时,可以通过查看开源框架如Spring或Tomcat的源码,了解其如何调用监听器的接口方法。例如,Tomcat在处理请求时,会调用`ServletRequestListener`的`requestInitialized()`和`...

Global site tag (gtag.js) - Google Analytics