我們使用StandardManager for session(在內存中)在Tomcat 5.5中運行供應商提供的Web應用程序。由於會話會變得非常大(20M +),因此堆空間不足是一個嚴重問題。如果可能的話,用戶希望將會話保持幾個小時,但寧願將會話驅逐出去,而不是用完堆空間。看來供應商在會話對象中正確實現了Serializable,因此切換到持久會話管理器實現不是一種選擇。Tomcat會話驅逐以避免OutOfMemoryError
的Tomcat允許一個設置maxActiveSessions屬性,將限制在經理會議的總人數。但是,如果達到此限制,則在現有會話過期之前不能創建新會話。我們希望首先摧毀最近最少使用的會話。
理想情況下,我們希望當堆使用率接近「XMX」,即使他們沒有足夠老無條件過期設置過期有些不是最近使用的會話。一個非常老的Tomcat開發人員郵件列表線程表明,這可能會導致拒絕服務攻擊*,但是,由於此應用程序僅在公司網絡中可用,因此我們對此毫不關心。
我想過延伸StandardManager覆蓋processExpires()和揍額外會議,如果堆使用比,比如說更大,最大的85%。但是,這在實踐中似乎有點問題。如果堆沒有被引用,那麼垃圾收集器將能夠收集大量對象(如果它困擾着運行)以將堆減少到最大值的50%?我會不必要地過期會議。我想我們可以通過一些積極的垃圾收集設置來緩解這種風險。另外,我如何知道在會話結束後保存了多少內存?我必須等待幾個GC週期才能確定。也許我可以採取保守的方法,每個後臺進程週期至多刪除N個會話,直到內存降至可接受的閾值以下。我可以序列化會話作爲估計有多少東西將被GC化的方式,但是這依賴於供應商實現Serializable並將實例變量標記爲臨時適當的。
有沒有人解決過這個問題?作爲一個短期的解決辦法,我們正在增加堆的大小,但是這種創可貼也有其缺點。
- 他們指的是一個公共場所,會議將在登錄前創建。有人可能會導致創建許多新會話,並擠出實際使用的會話。
更新:我們真的沒有在系統的架構太多的控制,我們特別不能減少會話使用。但是,我們可以儘可能多地與容器對接。但是,Tomcat是供應商支持的唯一開源Servlet容器。
我們剛剛把堆從1G提升到1.5G。通過20M的會話,我們會感覺到很久以前我們運行Tomcat時默認的JVM設置。 – ShabbyDoo 2009-07-29 03:01:21
誤讀了您的原始問題,很抱歉 - 沒有意識到您已經嘗試增加堆大小 – 2009-07-29 03:08:39
是否設置了其他Tomcat實例以形成羣集選項? – 2009-07-29 03:09:29