论坛首页 Java企业应用论坛

使用Wicket开发网站出现内存溢出的讨论

浏览 7494 次
精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-15  
魔力猫咪 写道
请问你们遇到溢出的时候,有对JVM内存使用情况进行分析吗?不会是别处的内存泄漏吧!建议把内存快照拿下来进行分析,不然很难确定是什么东西造成的泄漏。
优化很重要,必须确定合适的内存大小、堆大小,太大太小都不好。


我尝试使用netbeans profilers分析系统性能和内存,内存占用主要包括两块,一个是hibernate实体类二级缓存,大概有200M左右,另外是wicket用到的,不过这个工具也是第一次使用,不知道如何入门,我是看着这个文档做的(http://www.javaperformancetuning.com/tools/netbeansprofiler/)

wicket内存占用我是从wicket在磁盘中的session文件大小来推断的
0 请登录后投票
   发表时间:2009-08-15  
我的建议是当溢出的时候把JVM的堆快照抓下来,然后用分析工具进行分析。
0 请登录后投票
   发表时间:2009-08-15  
我觉得可以首先确认下问题本身是属于"内存泄露",还是"线程过多导致内存使用过多".
两者都会在一定程度之后,导致JVM崩溃.

上面提到的netbeansprofiler,瞄了一眼.好像没能看出什么问题来.
建议你的解决步骤:
1.(JDK1.4.2_19,或参照http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#DebuggingOptions)
JAVA_OPTIONS,添加
-XX:HeapDumpPath=./java_pid.hprof
-XX:+HeapDumpOnOutOfMemoryError

2.LoadRunner压力一下,按照你说的情况,很容易出现JVM崩溃,出错之后,生成hprof文件

3.使用工具分析下出现哪里的代码导致了崩溃.
可以分析到具体的类,具体的方法,同样也可以找到对象的大小等等关系
我用过的工具连接:
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/webcontent/uuid/8070021f-5af6-2910-5688-bde8f4fadf31
分析的一篇参考文章:
https://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/6856

4.后续.
任何系统都会有最大容量限制
后续可以根据最大在线用户添加系统限制.防止系统过载.
另外,就是代码内存使用的优化了.

0 请登录后投票
   发表时间:2009-08-15  
基本确定是wicket消耗过多内存引起的问题,主要是session文件过大,我将占用内存比较多的几个页面setVersioned(false),内存占用明显降低了,主要原因应该是编码时有些事项没考虑到,还不清楚,正查找
0 请登录后投票
   发表时间:2009-08-17  
profiler这种工具只能用来检测大的瓶颈点
至少小的点,基本用处不大,而且经常误导。
我仍然建议先用DiskSessionStore进行分析,检测哪一个页面占用空间过大。

另外不得不说,Wicket的stateless做得确实不好。
如果是我做,可能会提供一个stateless页面,然后强迫在某个方法中加载控件或者模型。
不过现在主要方向不是wicket,所以也没有时间再开发一些额外的功能了。
0 请登录后投票
   发表时间:2009-10-05   最后修改:2009-10-05
纠正之前对wicket 内存溢出的怀疑:

结合大家上述提出的一些内存占用分析工具,并都tomcat下临时session文件分析得出的,经过近两个月的调试和跟踪发现,内存溢出不是主要因为wicket session 内存占用引起的,是由于使用hibernate 查询缓存导致的。

通过程序调优,并将系统运行环境迁移到linux中,性能有很大提高。

不过wicket back和foward按钮问题还没找到好的解决办法。



0 请登录后投票
   发表时间:2010-03-28  
在此总结一下wicket学习使用的一些心得体会
1.使用dataprovider+detachabledatamodel组合模式,主要的好处:可以减少Page/Panel等组件代码整洁,数据提供和展示各司其职;提高代码重用;解决wicket session过大导致访问量上去后内存溢出问题;这一点在wicket官方文档中强调不过,初学入门时往往为了少写一些代码直接使用ListView+List方式;
2.当page或者page部分代码行数较多时,考虑是否可以抽取代码来组件新的对象;一般常用的是Panel扩展;提高代码重用;
3.经常关注wicket nabble论坛,空的时候看看别人的讨论,会有受益;
0 请登录后投票
论坛首页 Java企业应用版

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