首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

合理設定 JSP Request 與 Session 逾時,避免高併發下記憶體洩漏

     編輯:關於JSP

問題現場

  • 環境:JBoss 4.2.2,JVM 1GB,200 併發,50 萬請求。
  • 現象:ConcurrentHashMap 記憶體持續增長不釋放,JProfiler 追蹤發現源頭為 JSP Request Session。
  • 原因:預設 Session 逾時 30 分鐘,高併發下大量 Session 物件堆積,GC 來不及回收。

Session 機制與記憶體關係

  • 每個 Session 內部以 ConcurrentHashMap 儲存屬性。
  • Session 建立後,若無 invalidate() 或逾時,物件長駐堆疊。
  • 高併發 + 長逾時 = 記憶體壓力劇增,甚至 OOM。

解決策略

1. 關閉不需要 Session 的頁面

<%@ page session="false" %>

靜態頁、純展示頁、API 端點均應關閉,避免無謂建立 Session。

2. 縮短逾時時間

  • web.xml 全域設定(單位:分鐘):
<session-config>
    <session-timeout>10</session-timeout> <!-- 視業務調整 5~15 分鐘 -->
</session-config>
  • 程式碼動態設定:session.setMaxInactiveInterval(300)(秒)。

3. 用畢即銷毀

// 登出、流程結束時
session.invalidate();

4. 監控與調優

  • 定期檢視 Session 數量(JMX/管理主控台)。
  • 若使用叢集,啟用 Session 複寫需評估網路與記憶體成本。
  • 考慮使用 Redis/Memcached 外部化 Session,降低 JVM 堆疊壓力。

經驗總結

「Session 是雙面刃,方便狀態管理卻消耗記憶體。高併發系統必須:
1. 能關就關(session="false")
2. 逾時設短(session-timeout)
3. 用完即銷(invalidate())
4. 壓力大時外部化」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved