2009-07-29 37 views
2

我們使用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容器。

回答

1

您是否嘗試過增加JVM的最大堆大小?

默認的,如果沒有指定,是隻有64MB - 這是我想說的是小方爲最密集的/全面的Web應用程序。

與Tomcat能夠做到這一點,最好的辦法就是添加以下setenv.bat/.sh:你想

export CATALINA_OPTS=-Xmx128m 

(替代不管值128,如果你想大於128MB。還要更改爲正確的Windows/shell的語法)

startupcatalina Tomcat的shell腳本具有內置邏輯來調用此文件(如果存在)。這是指定您需要爲Tomcat安裝設置的任何自定義環境屬性的「最佳實踐」方式 - 將該屬性放在此文件中比直接編輯0​​或catalina.sh要好,因爲此文件可以在Tomcat安裝/版本之間移植。

您可能也對這個鏈接感興趣:6 Common Errors in Setting Java Heap Size(它也有一個末尾部分在如何在Tomcat中設置java堆大小?)。

+0

我們剛剛把堆從1G提升到1.5G。通過20M的會話,我們會感覺到很久以前我們運行Tomcat時默認的JVM設置。 – ShabbyDoo 2009-07-29 03:01:21

+0

誤讀了您的原始問題,很抱歉 - 沒有意識到您已經嘗試增加堆大小 – 2009-07-29 03:08:39

+0

是否設置了其他Tomcat實例以形成羣集選項? – 2009-07-29 03:09:29

4

您的選項似乎是:

  1. 減少空閒會話超時,
  2. 使會話持久性(用戶登錄也許只有後),
  3. 減少每個會話對象使用的內存,
  4. 增加您的Tomcat實例的內存,
  5. 運行您的服務的多個實例,並將負載均衡器放在它/它們前面。

從技術角度看,3是最好的解決方案......如果它有效。其他人都有一個缺點。

用記憶做聰明的事情只是一個創可貼。從用戶的角度來看,這會讓您的網站行爲更難理解。此外,如果您的用戶羣/流量呈現上升趨勢,那麼您只能解決尋找可持續解決方案的問題。

0

我建議通過前面多個使用apache的tomcat實例,然後使用mod_jk在它們之間加載平衡。

你可以做到這一點沒有任何真正的集羣,所以會議共享不會是一個問題。

mod_jk的是堅如磐石,甚至提供了一個簡單的GUI實例標記爲停止使用等

這也將在彈性等方面帶來許多其他好處,我親自使用此設置上非常大規模的公共場所,它的魅力。

理想的情況是建立真正的會話共享,但在某些情況下,這是矯枉過正。

在這裏看到:

http://tomcat.apache.org/connectors-doc/generic_howto/quick.html

0

我同意斯蒂芬ç,它是你的供應商,你需要佔用問題 - 因爲他說,即使交換機廠商。 有一件事,沒有人在這裏提到(令人驚訝的是)供應商也應該看清楚未使用的會話對象。

這很容易,除非你始終記住,讓會話大小膨脹 - 讓一個對象的大小膨脹不被注意 - 當我們有這些對象的列表時,然後有大會話attribs - 然後永遠不會清理它們 - 如果應用程序很大,在應用程序的某些部分顯示對象列表A,B,C,D,E,F,但從未清理過,那麼這是供應商未解決的基本內務管理問題。

例如在Web應用程序中是否有一個「中央屏幕」,您可以導航到應用程序的其他部分?如果是這樣,則供應商必須進入該屏幕時,可以清理該會已收集並塞進會話是從中央頁/屏幕訪問屏幕上/中的所有對象門戶

編輯並使用分頁,不加載整個列表符合條件(除非分頁是標準的一部分)

我希望評論可以幫助你和其他人。