`
yangzb
  • 浏览: 3503336 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用IntrospectorCleanupListener 解决quartz引起的内存泄漏

阅读更多

"在服务器运行过程中,Spring不停的运行的计划任务和OpenSessionInViewFilter,使得Tomcat反复加载对象而产生框架并用时可能产生的内存泄漏,则使用IntrospectorCleanupListener作为相应的解决办法。"

对于这一句话,引用关于IntrospectorCleanupListener一段解释:

引用
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>

只知道servlet标准不允许在web容器内自行做线程管理,quartz的问题确实存在。  

对于Web容器来说,最忌讳应用程序私自启动线程,自行进行线程调度,像Quartz这种在web容器内部默认就自己启动了10线程进行异步job调度的框架本身就是很危险的事情,很容易造成servlet线程资源回收不掉,所以我一向排斥使用quartz。

quartz还有一个问题就是不支持cluster。导致使用quartz的应用都没有办法做群集。

如果是我的话,我采取的办法就是自己单独启动一个Job Server,来跑job,不会部署在web容器中。

分享到:
评论
3 楼 在世界的中心呼喚愛 2014-12-23  
评论有价值
2 楼 wuguowenq 2014-01-09  
好文,回复只为收藏
1 楼 yangzb 2011-04-20  
SSH内存泄露及Spring Quartz问题

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://anoxia.blogbus.com/logs/34360203.html

    问题的起因:

         为客户开发了一个系统权且称他为TM吧,用的是tomcat6+myelipse6+jdk1.6环境,框架用SSH。我调试完这个系统程序后,将此程序重新COPY了一份,改名叫TMT,但是发布的Web名还是叫TM。同样用同一个Tomcat来Run的。问题发生了,我在TMT项目里修改后,RUN起来运行的居然是TM项目中的代码。
        尝试过删除TOMCAT6下的WORK目录下的缓存文件,也尝试过在TOMCAT的BIN目录下的Startup.bat中脚本头部加上一句:
    rd /s /q TM
    rd /s /q ..\work\Catalina\localhost\TM
    ..\bin\catalina start
    还是没有用。
        在TOMCAT6的conf目录下server.xml中添加:
    <Context path="" docBase="" debug="0" reloadable="true" />
    也还是没有用。
        在Tomcat的manage里也reload过了,都无法更新程序版本,运行都是之前TM项目中的代码,之后TMT项目里的代码链接的数据库和TM项目链接的数据库是不同的,将hibernate的执行sql的语句显示在Console界面中,发现数据库用的是TM项目中的数据库,可我运行的程序是 TMT项目。无语了。。。。

        尝试清除Eclipse的缓存,删除[eclipsehome]/configuration下除.settings子目录和config.ini文件外其它的子目录。 还是没有用,仍然调用是老的程序。
        最后尝试在myclipse的快捷方式启动是加入参数 -clean启动,还是无济于事。

    =======================================================

         接下来在javaeye中遍寻解决方案,无意中翻到Struts+Spring+Hibernate内存泄漏查找与处理一篇Robbin参与讨论的帖子,谈到使用org.springframework.web.util.IntrospectorCleanupListener监听器处理由 JavaBeans Introspector的使用而引起的缓冲泄露的问题,和Quartz定时调度比较理想的使用方式。以下节选部分内容供今后参考学习。

    =======================================================

    IntrospectorCleanupListener使用:

          "在服务器运行过程中,Spring不停的运行的计划任务和OpenSessionInViewFilter,使得Tomcat反复加载对象而产生框架并用时可能产生的内存泄漏,则使用IntrospectorCleanupListener作为相应的解决办法。"

    引用:

         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>

    =======================================================

    Quartz问题:

    引用Robbin原话:

         对于Web容器来说,最忌讳应用程序私自启动线程,自行进行线程调度,像Quartz这种在web容器内部默认就自己启动了10线程进行异步job调度的框架本身就是很危险的事情,很容易造成servlet线程资源回收不掉。quartz还有一个问题就是不支持cluster。导致使用quartz的应用都没有办法做群集。

         采取的办法就是自己单独启动一个Job Server,来跑job,不会部署在web容器中。其他web节点当需要启动异步任务的时候,可以通过种种方式(DB, JMS, Web Service, etc)通知Job Server,而Job Server收到这个通知之后,把异步任务加载到自己的任务队列中去。
         其实想改造当前已经集成quartz的web应用也不算困难:
         例如可以使用数据库的表来记录和维护任务队列和状态,把quartz部分完全从web应用中剥离出去,自己写一个Java Main程序把配置quartz的spring容器跑起来,这样Job Server就启动了(注意这个Job Server完全脱离tomcat)。此外这个Main程序应该再启动一个子线程,定期扫描数据库的任务队列表:
         有新的任务就加入quartz的任务调度;
         把当前任务的执行状态写入任务表;
         看到删除任务的表字段状态以后,删除相应的任务。
         然后web应用去掉quartz部分配置,把原来的调用quartz任务的代码改写为读写数据库的任务表,这样就把job部分完全从web容器剥离掉了,甚至web容器做cluster也没有问题了,并且多个web节点在同时读写任务表的时候,还有数据库的事务来确保操作的一致性,实在是很棒。
         另外还可以单独做一个job管理界面,可以通过web界面手工添加任务,查看任务状态,删除任务等等。

相关推荐

    基于内存的Quartz集群配置手册 [中文]

    首先,Terracotta Job Store for Quartz是Quartz与Terracotta集成的一种解决方案,它允许Quartz作业和触发器存储在内存中,从而实现跨多个节点的集群。Terracotta是一个提供统一的内存数据网格的平台,能够确保所有...

    Android studio下的quartz工程

    - **生命周期管理**:确保在应用启动时启动调度器,并在退出时关闭,以防止内存泄漏。 - **权限申请**:如果任务涉及网络、存储等操作,记得申请相应的权限。 - **测试与调试**:在开发环境中,可能需要频繁调整触发...

    Quartz 定时WebForm和WinForm使用的dll

    这个标题“Quartz 定时WebForm和WinForm使用的dll”暗示了我们将在WebForm和WinForm应用中使用Quartz来实现定时功能。在.NET环境中,Quartz通过引入特定的DLL文件来实现其功能。 首先,我们要理解什么是DLL...

    QuartzDemo及iis闲置时间解决方案

    Quartz和IIS是两种在IT领域中广泛使用的工具,它们分别用于任务调度和Web服务管理。这篇内容将深入探讨这两个概念以及如何解决IIS闲置时间的问题。 首先,让我们了解Quartz。Quartz是一个开源的Java作业调度框架,...

    myssh__集成quartz内存版

    【标题】"myssh__集成quartz内存版" 指的是一个基于MySSH(可能是Mybatis+Spring+Struts的组合)项目,它已经集成了Quartz作为其任务调度框架,并且这个版本的Quartz运行在内存中,这意味着所有的定时任务都在应用...

    quartz-2.2.3版本的quartz初始化sql语句

    - 配置Quartz的`JobStore`实现,例如使用`RAMJobStore`(内存存储,适合小型应用)或` JDBCJobStore`(数据库存储,适合大型分布式系统)。 - 对于`JDBCJobStore`,需要正确配置数据库连接参数,如URL、用户名、密码...

    Quartz开发使用说明文档

    Quartz开发使用说明文档 Quartz是一个功能强大且广泛应用的开源作业调度框架,主要用于实现业务逻辑中的定时任务、批处理、事件触发等场景。Quartz的主要特点是高可用性、可扩展性、灵活配置、支持多种数据库和集群...

    Quartz 定时任务web使用

    - 深入研究Quartz的源码,有助于理解其内部工作原理,如JobStore的实现(内存、数据库等)、调度算法等,这有助于优化和定制自己的调度需求。 通过上述内容,我们可以构建一个基于Quartz的Web应用定时任务系统,...

    完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题

    6. **监控与故障转移**:使用Quartz的监控工具,如`AdminUI`,监控集群状态,确保在服务器故障时任务能被其他服务器接管。 7. **Spring整合**:在Spring中配置Quartz,通过`SchedulerFactoryBean`来创建和管理...

    Quartz 线程池

    3. **监控与调整**:实时监控 Quartz 的运行状态,如线程池的利用率、任务执行时间等,以便及时发现并解决问题。 ### 五、实战案例 在实际项目中,我们可以利用 Quartz 设计定时任务,例如定期备份数据库、清理...

    quartz 集群解决方法

    为了便于监控和管理Quartz集群,可以使用Web管理界面如`QuartzAdmin`或者通过API接口获取集群状态和任务信息。 9. **源码阅读**: 对于深入理解Quartz集群的工作原理,阅读源码是一个很好的途径。了解`Cluster...

    springboot中使用quartz

    在本教程中,我们将深入探讨如何在Spring Boot环境中配置和使用Quartz,以及解决服务注入和服务层传参的问题。 首先,让我们了解Spring Boot与Quartz的集成基础。要在Spring Boot项目中引入Quartz,我们需要在`pom....

    关于spring中quartz的配置

    在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中安排定时任务的执行。Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中...

    ASP.NET使用Quartz.NET实现定时任务调度

    总的来说,使用ASP.NET、Quartz.NET和TopShelf的组合,开发者可以构建出一个高效、稳定且易于维护的任务调度系统,对于需要后台自动化处理的工作场景,这是一种非常实用的解决方案。在实际应用中,可以根据具体需求...

    Quartz(任务调度)使用培训

    标题和描述中提到的主题是关于Quartz任务调度系统的使用培训。Quartz是一个开源的任务调度库,其主要用途是让开发者能够轻松地安排在特定时间或根据特定规则运行代码的任务,也就是作业(Jobs)。Quartz能够与Java...

    quartz-1.6.5使用手册

    Quartz 1.6.5 使用手册概述 Quartz 是一个功能强大且灵活的开源作业调度框架,广泛应用于各种企业级应用程序中。以下是 Quartz 1.6.5 使用手册的概述和相关知识点总结。 环境准备 在开始使用 Quartz 之前,需要...

    quartz内部表.sql

    quartz内部表.sql。

    quartz使用指南

    quartz使用指南,quartz使用指南,quartz使用指南

    使用quartz需要的jar包

    在使用Quartz时,确保正确引入所需的jar包至关重要,因为这些jar包包含了Quartz运行所需的所有类和资源。 1. **Quartz核心库**: 主要的jar包是`quartz.jar`,它包含了Quartz的核心组件,如Scheduler、Job、...

Global site tag (gtag.js) - Google Analytics