`
追梦java
  • 浏览: 36970 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

关于struts和Tomcat7报告:Memory Leak 的问题。

 
阅读更多
环境:struts2.2.1.1 + Spring3.05 + MyBatis + Tomcat7 。
现象:Tomcat每隔一段时间就报告Out Of Memeory Exception。 分析检查得知只要在tomcat7的管理端使用stop、reload就会导致memory leak。后台报错是:The web application [/XXXX] created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@4a11a8]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@cd32e5]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. 网上搜索都是什么CleanUp的问题,类似于:
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
结果都不灵。struts2官网上已经不推荐使用原始的filter了,改用什么prepareddispatchfilter以后就不需要增加上面的配置了。以为是工程的问题,从官网上下载demo,googlecode,嘿嘿嘿,严重警告,涛声依旧。

过程:开始还有其余几个类似的问题,都是由于使用Threadlocal而没有及时的清理掉导致的,重构代码就解决了。但是还有些问题,包括:The web application [/XXXX] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
从网上检索类似的问题都能够解决了。比如 JDBC driver的问题,可以使用一个listener,来监听application的结束事件,在事件中unregiste所有的驱动程序。由于系统用到了Spring的timer类,还出现了10个类似于以下的问题:
The web application [/XXXX] appears to have started a thread named [scheduler_Worker-1] but has failed to stop it. This is very likely to create a memory leak.都可以在listener中进行处理掉。但是最后剩下上面的那个问题无论如何怎么修改程序都不能去掉了。看样子也是由于使用 ThreadLocal变量导致的无法清理程序造成的。使用排除法,去掉部分代码,检查问题,依旧。去掉所有编写的代码,检查问题,依旧。这里两句话,实际上用了差不多两天。最终发现是struts2使用的xwork导致的问题。参见:https://issues.apache.org/jira/browse/WW-2167,号称解决了,其实呢。。。。就是ContainerImpl,反编译ContainerImpl$10.class得到一个threadlocal的实现。嘿嘿,下载源代码吧。修改源码,在
<T> T callInContext(ContextualCallable<T> callable) {
Object[] reference = localContext.get();
if (reference[0] == null) {
reference[0] = new InternalContext(this);
try {
return callable.call((InternalContext) reference[0]);
} finally {
// Only remove the context if this call created it.
reference[0] = null;
}
} else {
// Someone else will clean up this context. ////PS:这个注释真真真。。。。。
return callable.call((InternalContext) reference[0]);
}
}
方法中,增加try finally,在最后设置localcontext为空,看看结果:直接OutOfMemory,HeapSpace。。。。看来struts源码不是随便就可以改的啊!呵呵,没关系,还有招数,增加destroy方法,手动移除threadlocal变量,并设置该threadlocal为null,结果则么样??tomcat报错了,呵呵,在checkThreadLocalMap的时候,就直接空指针了。。。怎么办,那好,既然tomcat还要求必须检查该变量,OK,我只去除threadlocal中的内容,而不动threadlocal,总可以了吧。于是使用localcontex.remove()方法,这里还有个小插曲,本意是使用while循环,去掉localcontext中的所有内容,无奈死循环。。。哦,threadlocal,每thread只有一份,嘿嘿。基础知识不牢靠,靠。打包、发布,您猜怎么着,成功了!可是虽然后台不报告错误了,在tomcat7前台,findleak的时候,依然会有报告出来,我晕。后台不报错了都,哪里有leak??发现是spring 的quartz导致的,虽然我在 listener中对其进行了处理,但是在tomcat对他进行检查的时候,这个处理还没有进行。呵呵,不管。
最终方案: 使用修改过的xwork-core.jar,我命名为xwork-core2.2.9.1.jar以示与原来2.2.1.1的区别。放到maven上,嘿嘿大家用去吧。
下载地址:http://maven.marsorstudio.cn/org/apache/struts/xwork/xwork-core/2.2.9.1/
下载不了告诉我,到时候再确认吧,嘿嘿,懒一下。
分享到:
评论

相关推荐

    六首页数字藏品NFT交易网React NextJS网站模板 六首页数字藏品nft交易网反应NextJS网站模板

    六首页数字藏品NFT交易网React NextJS网站模板 六首页数字藏品nft交易网反应NextJS网站模板

    wireshark安装教程入门

    wireshark安装教程入门

    基于C++负数据库的隐私保护在线医疗诊断系统

    【作品名称】:基于C++负数据库的隐私保护在线医疗诊断系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于负数据库的隐私保护在线医疗诊断系统 NDBMedicalSystem 客户端及服务器端 本项目是在保护用户隐私的前提下,完成了对新冠肺炎、乳腺癌、眼疾等多种疾病的智能诊断。

    基本的嵌入式操作系统给

    任务管理

    3-10.py

    3-10

    Python3+MATLAB无线传感器网络相关仿真 基于RSSI测距的多边定位法仿真 生成五种网络拓扑结构源码.zip

    Python3+MATLAB无线传感器网络相关仿真 基于RSSI测距的多边定位法仿真 生成五种网络拓扑结构源码.zip

    matlab交互式课件模块,介绍了典型的工作流程,设置,以及涉及到用机器学习解决回归问题的考虑.zip

    matlab交互式课件模块,介绍了典型的工作流程,设置,以及涉及到用机器学习解决回归问题的考虑.zip

    563563565+3859

    5635356

    基于Matlab的模糊控制PID仿真以及相应的论文验证参数源码+文档+各种资料.zip

    基于Matlab的模糊控制PID仿真以及相应的论文验证参数源码+文档+各种资料.zip

    麦肯锡-年月xx集团战略设计和首次上市咨询报告.ppt

    麦肯锡-年月xx集团战略设计和首次上市咨询报告.ppt

    麦肯锡 把握中国资本市场的机遇.ppt

    麦肯锡 把握中国资本市场的机遇.ppt

    基于python深度学习实现多种农产品价格预测源码+项目说明.zip

    基于python深度学习实现多种农产品价格预测源码+项目说明.zip个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 基于python深度学习实现多种农产品价格预测源码+项目说明.zip个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 基于python深度学习实现多种农产品价格预测源码+项目说明.zip个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 基于python深度学习实现多种农产品价格预测源码+项目说明.zip个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 基于python深度学习实现多种农产品价格预测源码+项目说明.zip个人经导师指导并认可通过的98分大作

    matlab华松敏编写的教科书《机器人理论与技术基础》的源代码.zip

    matlab华松敏编写的教科书《机器人理论与技术基础》的源代码.zip

    setuptools-23.0.0-py2.py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ChatGPT 中文调教指南.zip

    ChatGPT是由OpenAI训练的一款大型语言模型,能够和你进行任何领域的对话。 国内中文版 它能够生成类似于人类写作的文本。您只需要给出提示或提出问题,它就可以生成你想要的东西。 充当 Linux 终端 我想让你充当 Linux 终端。我将输入命令,您将回复终端应显示的内容。我希望您只在一个唯一的代码块内回复终端输出,而不是其他任何内容。不要写解释。除非我指示您这样做,否则不要键入命令。当我需要用英语告诉你一些事情时,我会把文字放在中括号内[就像这样]。我的第一个命令是 pwd 充当英语翻译和改进者 我希望你能担任英语翻译、拼写校对和修辞改进的角色。我会用任何语言和你交流,你会识别语言,将其翻译并用更为优美和精炼的英语回答我。请将我简单的词汇和句子替换成更为优美和高雅的表达方式,确保意思不变,但使其更具文学性。请仅回答更正和改进的部分,不要写解释。我的第一句话是“how are you ?”,请翻译它。 充当论文润色者(拿摘要部分举例) 请你充当一名论文编辑专家,在论文评审的角度去修改论文摘要部分,使其更加流畅,优美。下面是具体要求: 能让读者快速获得文章的要点或精髓,

    matlab机器人课程和书籍中的问题.zip

    matlab机器人课程和书籍中的问题.zip

    麦肯锡_-_解决_问题_的_基本_方法_-_七步成诗.ppt

    麦肯锡_-_解决_问题_的_基本_方法_-_七步成诗.ppt

    麦肯锡培训手册——好的开始是成功的一半()如何进行团队及团队与客户之间的交流.ppt

    麦肯锡培训手册——好的开始是成功的一半()如何进行团队及团队与客户之间的交流.ppt

    Scrapy-1.2.0-py2.py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    stm32f103c8t6 写一个串口DMA程序

    stm32f103c8t6在STM32F103C8T6上编写一个使用DMA(Direct Memory Access)的串口(USART)程序,通常涉及以下几个步骤: 初始化串口(USART):设置波特率、数据位、停止位和校验位。 初始化DMA:配置DMA通道、传输方向、源地址和目标地址等。 配置NVIC(Nested Vectored Interrupt Controller):如果需要中断来处理DMA传输完成事件。 主程序循环:发送或接收数据,并处理相关事件。

Global site tag (gtag.js) - Google Analytics