zoukankan      html  css  js  c++  java
  • [刘阳Java]_Spring中IntrospectorCleanupListener的用途【补充】_第16讲

    这篇文章不是我自己原创的,但是为了后期的阅读,所以我收录网上的一篇文章。为了尊重作者的版权,转载地址先放上来,大家也可以去访问他的原始文章http://jadyer.cn/2013/09/24/spring-introspector-cleanup-listener/

    1. 简介

    JDK中的 java.beans.Introspector 的用途是:发现 Java 类是否符合 JavaBean 规范。如果有的框架或程序用到了 Introspector,那么就会启用一个系统级的缓存,里面存放一些曾加载并分析过的 JavaBean 引用。当服务器关闭时,由于缓存中存放着这些 JavaBean 引用,故垃圾回收器无法回收 Web 容器中的 JavaBean 对象,使得内存变大。而 org.springframework.web.util.IntrospectorCleanupListener 就是专门用来处理 Introspector 内存泄漏问题的辅助类,IntrospectorCleanupListener 会在 Web 服务器停止时清理 Introspector 缓存,使那些 Javabean 能被垃圾回收器正确回收。当然 Spring 自身不会出现这种问题:因为 Spring 在加载并分析完一个类之后会马上刷新 JavaBeans Introspector 缓存,但有些程序和框架在使用了 JavaBeans Introspector 之后,没有进行清理工作(比如Quartz、Struts),最后导致内存泄漏

    2. 总结

    • 此监听器可以解决 java.beans.Introspector 导致内存泄漏的问题
    • 它应该配置在 web.xml 中与 Spring 相关监听器中的第一个位置(也要在ContextLoaderListener的前面)

    3. 大家可以参考一下下面的web.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
        <!-- Web容器加载顺序ServletContext==>context-param==>listener==>filter==>servlet -->
    
        <!--
        使用ContextLoaderListener时需要告诉它Spring配置文件的位置,它默认会去找/WEB-INF/applicationContext.xml
        不过可以设置contextConfigLocation参数,来为上下文载入器指定一个或多个Spring配置文件
        注意:contextConfigLocation参数是一个用逗号分隔的路径列表,其路径是相对于Web系统的根路径的
        -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/jadyer-servlet.xml, classpath:applicationContext-*.xml</param-value>
        </context-param>
    
        <!-- 防止发生java.beans.Introspector内存泄露,应将它配置在ContextLoaderListener的前面 -->
        <listener>
            <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
        </listener>
    
        <!--
        配置上下文载入器,载入除DispatcherServlet载入的配置文件之外的其它上下文配置文件
        最常用的上下文载入器是一个Servlet监听器,其名称为ContextLoaderListener
        -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!--
        SpringMVC的前端控制器
        当DispatcherServlet载入后,它将从一个XML文件中载入Spring的应用上下文,该XML文件的名字取决于<servlet-name>
        这里DispatcherServlet将试图从一个叫做springmvc-servlet.xml的文件中载入应用上下文,其默认位于WEB-INF目录下
        不过也可以让它去找别的配置文件,修改方法为:配置局部的<init-param>参数
        -->
        <servlet>
            <servlet-name>jadyer</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applicationContext.xml</param-value>
            </init-param>
            -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>jadyer</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>
  • 相关阅读:
    mysql权限
    Win7_64位使用Mysql Odbc
    二叉树的遍历
    Notepad++的使用
    mysql与mysqld
    Mysql 聚集函数和分组
    Linux 目录
    Linux 倒引号、单引号、双引号
    openkm安装过程
    rhel 7 设置默认运行级别为图形
  • 原文地址:https://www.cnblogs.com/liuyangjava/p/6856413.html
Copyright © 2011-2022 走看看