锁定老帖子 主题:使用Wicket开发网站出现内存溢出的讨论
精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-15
魔力猫咪 写道 请问你们遇到溢出的时候,有对JVM内存使用情况进行分析吗?不会是别处的内存泄漏吧!建议把内存快照拿下来进行分析,不然很难确定是什么东西造成的泄漏。
优化很重要,必须确定合适的内存大小、堆大小,太大太小都不好。 我尝试使用netbeans profilers分析系统性能和内存,内存占用主要包括两块,一个是hibernate实体类二级缓存,大概有200M左右,另外是wicket用到的,不过这个工具也是第一次使用,不知道如何入门,我是看着这个文档做的(http://www.javaperformancetuning.com/tools/netbeansprofiler/) wicket内存占用我是从wicket在磁盘中的session文件大小来推断的 |
|
返回顶楼 | |
发表时间:2009-08-15
我的建议是当溢出的时候把JVM的堆快照抓下来,然后用分析工具进行分析。
|
|
返回顶楼 | |
发表时间: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.后续. 任何系统都会有最大容量限制 后续可以根据最大在线用户添加系统限制.防止系统过载. 另外,就是代码内存使用的优化了. |
|
返回顶楼 | |
发表时间:2009-08-15
基本确定是wicket消耗过多内存引起的问题,主要是session文件过大,我将占用内存比较多的几个页面setVersioned(false),内存占用明显降低了,主要原因应该是编码时有些事项没考虑到,还不清楚,正查找
|
|
返回顶楼 | |
发表时间:2009-08-17
profiler这种工具只能用来检测大的瓶颈点
至少小的点,基本用处不大,而且经常误导。 我仍然建议先用DiskSessionStore进行分析,检测哪一个页面占用空间过大。 另外不得不说,Wicket的stateless做得确实不好。 如果是我做,可能会提供一个stateless页面,然后强迫在某个方法中加载控件或者模型。 不过现在主要方向不是wicket,所以也没有时间再开发一些额外的功能了。 |
|
返回顶楼 | |
发表时间:2009-10-05
最后修改:2009-10-05
纠正之前对wicket 内存溢出的怀疑:
结合大家上述提出的一些内存占用分析工具,并都tomcat下临时session文件分析得出的,经过近两个月的调试和跟踪发现,内存溢出不是主要因为wicket session 内存占用引起的,是由于使用hibernate 查询缓存导致的。 通过程序调优,并将系统运行环境迁移到linux中,性能有很大提高。 不过wicket back和foward按钮问题还没找到好的解决办法。 |
|
返回顶楼 | |
发表时间:2010-03-28
在此总结一下wicket学习使用的一些心得体会
1.使用dataprovider+detachabledatamodel组合模式,主要的好处:可以减少Page/Panel等组件代码整洁,数据提供和展示各司其职;提高代码重用;解决wicket session过大导致访问量上去后内存溢出问题;这一点在wicket官方文档中强调不过,初学入门时往往为了少写一些代码直接使用ListView+List方式; 2.当page或者page部分代码行数较多时,考虑是否可以抽取代码来组件新的对象;一般常用的是Panel扩展;提高代码重用; 3.经常关注wicket nabble论坛,空的时候看看别人的讨论,会有受益; |
|
返回顶楼 | |