程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> 一個JSP頁面導致的tomcat內存溢出的解決方法,jsp頁面tomcat溢出

一個JSP頁面導致的tomcat內存溢出的解決方法,jsp頁面tomcat溢出

編輯:關於JSP

一個JSP頁面導致的tomcat內存溢出的解決方法,jsp頁面tomcat溢出


今天新能測試組的同事找我看一個奇怪的現象。一個tomcat應用,裡面只有一個單純的jsp頁面,而且這個jsp頁面沒有任何java代碼(想用這個jsp頁面測試在她的服務器上的一個tomcat的最大QPS)。但是用loadrunner壓測了幾分鐘之後,分配了1024M堆內存的tomcat居然包heap space outofmemory!這個頁面的代碼如下:

復制代碼 代碼如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>test</title>
</head>
<body>
<p>hello world!</p>
</body>
</html>

最初的分析是,一個JSP頁面撐死了會產生一個對應的java文件,然後這個java文件編譯成class文件,加載到內存裡面去。也就是會有一個class對象會被加載到PermGen space裡面去。跟heap space是沒有任何關系的。但是最後報的是對空間溢出。於是猜測肯定是每請求一次jsp頁面就會生成一個對象。

百度了一下,發現每請求一次JSP頁面,會產生一個session對象。在tomcat的web.xml裡面有這麼個配置:

復制代碼 代碼如下:
<session-config>
<session-timeout>30</session-timeout>
</session-config>

也就是說每請求一次jsp頁面,會產生一個session對象,並且這個對象30分鐘後才過期。我們計算了下當時的QPS是5000,也就是說每秒鐘產生5000個session對象。每分鐘產生300K個對象,session是個map對象,比較大,這樣很快就會把內存撐爆。

解決辦法如下:

1.在page指令裡添加session=false。

2.把session的過期時間設成0。

現在她的loadrunner跑的很穩定。工作之後就再也沒有用過jsp了,查jsp的問題還是比較費力


一個30多M 的JSP空間需要多大的Tomcat 內存才不會出現Tomcat內存溢出?

內存溢出和網站大小沒有關系,主頁是程序的質量,如果寫網站的人的技術比較強,就很少會溢出(除非浏覽量非常大硬件跟不上),一般都是垃圾程序才會這樣的

給你個解決的辦法

1:選擇有tomcat監控功能的空間,當你的網站發生500(內存溢出)的時候他會自動幫內重啟tomcat,這樣可以讓你的網站穩定

2:選擇定時重啟tomcat功能的空間,這樣當你網站沒人的時候他會自動為你重啟tomcat,釋放你那不回收的內存

如果沒有這2個功能,估計你就是自己托管個服務器都還是會有內存溢出的問題,因為內存一旦不自己回收就會無限的脹大,有多少內存夠他浪費呢
 

一個對於jsp 內存消耗的問題

是不是 stream沒有關閉?
可以嘗試使用完將session消失的時候將jsp文件刪除,重寫session。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved