一個JSP頁面導致的tomcat記憶體溢出的解決方案

來源:互聯網
上載者:User

 今天新能測試組的同事找我看一個奇怪的現象。一個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的問題還是比較費力

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.