使用Wicket開發網站出現內存溢出的討論

本來是在新聞裏的,不過覺得那裏不合適討論這種問題,所以另外開了一個新的帖子

[b]greateWei說[/b]
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內存集羣方案才能解決。


[b]wl95421說[/b]
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,會發現對於互聯網來說,這種更合適。

[b]greateWei[/b]說
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三個框架是首選,三個框架都有異曲同工之妙。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章