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

阅读更多
本来是在新闻里的,不过觉得那里不合适讨论这种问题,所以另外开了一个新的帖子

greateWei说
wicket确实不错,基本上和桌面开发思想类似,一些常用的控件如Label、Tabbed Panel、Text、DateTime、Tree、Grid等上手使用非常方便,你可以做公用的panel,tree等,然后在多个页面中使用。

另外一个就是ajax支持对开发使用人员基本上是透明的,封装做的相当不错。

我觉得一般来说,wicket适合用于开发交互性比较强,用户操作比较复杂的应用管理类web应用,对于一般大流量、浏览性web网站不一定适合,主要原因wicket所有的状态采用session机制来保存管理,每个页面的状态也是保存在服务器端,这样一旦用户访问人数非常多的话,对服务器端压力非常大,特别是内存要求很高。

之前做了一个简单的外卖订餐网站(http://www.517wm.com),发现并发访问人数超过1500人左右时,经常性会发生内存溢出(tomcat 分配了 1G 内存,计算机内存是5G,使用普通PC机做服务器),要解决这个问题,估计只有通过tomcat集群或者一些其他jvm内存集群方案才能解决。


wl95421说
Wicket的性能并不差,给大家做个简单的分析,一般的页面,如果是用LoadModel,大概序列化后只占5-10K,每个Session中默认是放置5个页面,假设再开大一些,放置10页,也就是说对于每个Session来说,Wicket只占用100K左右的内存。

对于1500人的访问,即1500X100K,那么只占用150M内存,这个占用绝对不算大。
只不过对于大部分人来说,并不习惯使用LoadModel,所以将Model也Cache在Session中了,如果是列表数据,自然就大了很多,比如说一个25条数据的列表页面,序列化后肯定不是10K,至少也是个40K,搞不好100K,就算默认是5个页面,也要占用500K内存,1500个上来,就是750M,肯定完蛋。

所以如果出现这种情况,应该看LoadModel,而不是默认的Model。
另外如果情况不严重,可以考虑使用DiskSessionStore,性能也还不错。
再加一句,并不是所有的东西都需要放到Session中
多用一下StatelessForm,会发现对于互联网来说,这种更合适。

greateWei
to wl95421
去年年底也是看了你写的wicket用户手册入门的,之前还不了解wicket是干什么用呢,

之前确实没有使用LoadModel模式,主要是编码工作量问题吧,网站上线试用了一段时间后,随着资料增加和访问人数增加,内存溢出越来越频繁,后来基本上设计到大数据量列表的全部使用了LoadModel模式,不过内存问题还是存在的。

有几次,网站中一些搜索引擎爬虫收录时,并发数上去后,偶尔还是会发生内存溢出问题,我查看了硬盘中的session文件,发现大小基本上在300k左右,应该属于正常范围。

解决办法倒不是没有:
1.增加内存容量;不过tomcat在windows下似乎最大只能分配1G内存,linux应该没这个限制;
2.Terracotta也是一个选项;
3.session序列化机制改良,曾有人提出使用mem cache来实现;我现在使用的是默认session保存机制;

使用wicket一段时间,总的印象还是不错的。

原先主要做桌面应用软件开发的,发现切换到web开发挺自然的。ajax开发应用实在是方便,struts2虽然也有,当时看了基本上放弃使用struts2,主要是本人之前没有ajax开发调试经验;web部分代码重用非常方便,使用panel可以为你节省很多重复代码。

如果使用java开发web应用管理类网站,有频繁交互,需要有良好的用户体验,我觉得wicket、tapestry、GWT三个框架是首选,三个框架都有异曲同工之妙。

你可能感兴趣的:(wicket,JVM,Tomcat,Hibernate,应用服务器)