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

單一 JSP 頁面導致 Tomcat 記憶體溢出排查與解決

     編輯:關於JSP

問題現象

一個僅含「Hello World」靜態內容的 JSP 頁面,無任何 Java 程式碼。LoadRunner 壓測幾分鐘後,配置 1024MB Heap 的 Tomcat 拋出 OutOfMemoryError: Java heap space。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html ...>
<html><head><title>test</title></head>
<body><p>hello world!</p></body></html>

根因分析

  1. 初步推測:JSP 編譯產生 Class 物件載入 PermGen,與 Heap 無關
  2. 實際發現:每次請求 JSP 都會建立 Session 物件
  3. Tomcat web.xml 預設配置:
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

每請求建立一個 Session(Map 結構,佔記憶體較大),30 分鐘後才過期。壓測 QPS 5000 → 每秒 5000 Session → 每分鐘 300,000 物件,迅速耗盡 Heap。

解決方案

方案一:JSP 頁面指令停用 Session(推薦)

<%@ page session="false" %>

方案二:設定 Session 過期時間為 0

<session-config>
    <session-timeout>0</session-timeout>
</session-config>

驗證結果

套用方案一後,LoadRunner 壓測穩定運行,不再發生 OOM。

經驗總結

  • 靜態內容頁面務必加上 session="false"
  • JSP 預設自動建立 Session 是常見效能陷阱
  • 壓測時監控 Session 數量與 Heap 使用率
  • 生產環境評估是否真的需要 Session
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved