论坛首页 Java企业应用论坛

Struts+Spring+Hibernate内存泄漏查找与处理

浏览 60035 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-12-27  
年前一个项目开始使用了quartz,由于封装jbmp时有一个判断写错了,以为是quartz的原因,就通过起一个线程做定时器,运行下来都算正常。我觉得只要控制得当,还是比较好的,因为一些条件可以灵活判断。
0 请登录后投票
   发表时间:2006-12-27  
如果是大的应用,建议还是听robbin的,另外开一个进程做定时批处理。
0 请登录后投票
   发表时间:2006-12-28  
我的一点经验:
服务器当掉的时候,如果出现OutOfMemeryError,则可以断定是内存泄露造成的
这时候,用工具监视一下HEAP VIEW,模拟一下业务情景,也不用非得跑20多个小时,模拟前后都进行一次完全垃圾回收,把模拟前和模拟后的内存对象的快照对比一下,如果有某些对象多了,可以重点怀疑
如果不是HEAP泄露,还有个可能是PERM泄露,可能是-XX:MaxPerm
Size有点小,或者ClassLoader没有卸载装载的类

如果是服务器没有空闲线程,可以用kill -3 pid看一下各线程都在忙什么
0 请登录后投票
   发表时间:2006-12-28  
又多少意见,先收下谢谢了,项目已经交工,不可能做大得改动,发贴也就是为了大家一起讨论。

对于JEE里面得内存泄漏,大家可能都有自己相应得办法,而且大家提到的方法很多我都用过,但是这个东西很难精确定位,而楼上得朋友说比较一次快照就行,我真是佩服,请注意我得HEAP VIEW升高没有那么明显72小时下来也才几M,一个SnapShot就能比较出来的希望渺茫。

而更换框架的风险无疑是增大了许多,熟悉框架需要不少时间,项目组成员和后期维护人员的技术熟练程度都不允许随便更换框架,而且更换框架收益也不明显。

OpenSessionInView是好是坏大家都有自己的想法,我想高并发、远程访问的话必须慎用,我们接下来的项目中已经弃用,手动来处理这些东西增加了一点工作量,而且将JMS、SNMP剥离出来,如果有必要有两个Job也会拿出来,但是框架没有换,项目组里的人都熟悉Struts,即便我想用Tapestry,老板铁定不同意。

这里说到Tapestry我不得不说声遗憾,尽管被提升为Apache子项目,但是影响力还是不够,我花了1个月的时间学习Tapestry4,对于它的组件封装仍然不是得心应手,然后就得到消息说T5大量重构了代码,抛弃了前面的很多东西,文档少的可怜,出了问题也无处发问,这样的框架理念有多先进老板也不愿意吃这螃蟹。

0 请登录后投票
   发表时间:2006-12-28  
yueguangyuan 写道
又多少意见,先收下谢谢了,项目已经交工,不可能做大得改动,发贴也就是为了大家一起讨论。

对于JEE里面得内存泄漏,大家可能都有自己相应得办法,而且大家提到的方法很多我都用过,但是这个东西很难精确定位,而楼上得朋友说比较一次快照就行,我真是佩服,请注意我得HEAP VIEW升高没有那么明显72小时下来也才几M,一个SnapShot就能比较出来的希望渺茫。

而更换框架的风险无疑是增大了许多,熟悉框架需要不少时间,项目组成员和后期维护人员的技术熟练程度都不允许随便更换框架,而且更换框架收益也不明显。

OpenSessionInView是好是坏大家都有自己的想法,我想高并发、远程访问的话必须慎用,我们接下来的项目中已经弃用,手动来处理这些东西增加了一点工作量,而且将JMS、SNMP剥离出来,如果有必要有两个Job也会拿出来,但是框架没有换,项目组里的人都熟悉Struts,即便我想用Tapestry,老板铁定不同意。

这里说到Tapestry我不得不说声遗憾,尽管被提升为Apache子项目,但是影响力还是不够,我花了1个月的时间学习Tapestry4,对于它的组件封装仍然不是得心应手,然后就得到消息说T5大量重构了代码,抛弃了前面的很多东西,文档少的可怜,出了问题也无处发问,这样的框架理念有多先进老板也不愿意吃这螃蟹。



我们公司这一年多来一直在使用Tapestry,从T3到T4,也知道T5需要大量重构,痛苦中,但T应该是一种先进的思想,如果是新项目,让程序员从T4转T5应该难度不大,但如果要在原系统中升级,就痛苦了,我目前负责的项目是T3,可能要做第二期,无法使用T4、T5,烦恼中。。。
0 请登录后投票
   发表时间:2006-12-29  
为什么说quartz不能用在集群当中?只不过实现起来比较麻烦
0 请登录后投票
   发表时间:2006-12-29  
melin 写道
为什么说quartz不能用在集群当中?只不过实现起来比较麻烦


在cluster当中使用quartz,那么启动quartz某个任务的node状态和其他node状态就肯定不一样了。当node之间的状态都不一致,而且这种状态不一致还没有办法同步,请问你的cluster会不会出问题?
0 请登录后投票
   发表时间:2006-12-29  
把每个node状态保存在数据库。数据库的脚本quartz已经自带了。然后用时钟同步来保证node状态的同步,我以前就做过。
When you are running a Quartz cluster on separate machines, the clocks should be synchronized to prevent weird and unpredictable behavior. We have already mentioned that if the clocks are not in synch, that Scheduler instances will become confused about the state of other nodes. There are several easy ways to ensure the clocks are in synch, and there should be no reason not to do this.

The easiest way to synch the computers' clocks is to use one of the Internet Time Servers (ITS). For information on how to set up your clock based on one of these internationally accepted standards, see 
0 请登录后投票
   发表时间:2006-12-31  
robbin 写道
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界面手工添加任务,查看任务状态,删除任务等等。


就此想听听各位大师对cluster设计开发的经验...
0 请登录后投票
   发表时间:2007-01-02  
yueguangyuan 写道
spring中的提供了一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器。它主要负责处理由 
JavaBeans  Introspector的使用而引起的缓冲泄露。spring中对它的描述如下:

它是一个在web应用关闭的时候,清除JavaBeans Introspector的监听器.在web.xml中注册这个listener.可以保证在web 应用关闭的时候释放与掉这个web 应用相关的class loader 和由它管理的类


yueguangyuan 写道
已经很明显了,没有用Lisener的服务器的内存用量明显呈上升趋势


说不通地啊,假设是这个Listener起作用的话,说明你的servlet context在测试的24小时内被关闭了N次,只有这样才能触发contextDestroyed事件,肯定是你的某段代码有问题才会导致web应用反复自动重启。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics