一個(gè)JSP頁面導(dǎo)致的tomcat內(nèi)存溢出的解決方法
今天新能測試組的同事找我看一個(gè)奇怪的現(xiàn)象。一個(gè)tomcat應(yīng)用,里面只有一個(gè)單純的jsp頁面,而且這個(gè)jsp頁面沒有任何java代碼(想用這個(gè)jsp頁面測試在她的服務(wù)器上的一個(gè)tomcat的最大QPS)。但是用loadrunner壓測了幾分鐘之后,分配了1024M堆內(nèi)存的tomcat居然包heap space outofmemory!這個(gè)頁面的代碼如下:
<%@ 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>
最初的分析是,一個(gè)JSP頁面撐死了會(huì)產(chǎn)生一個(gè)對應(yīng)的java文件,然后這個(gè)java文件編譯成class文件,加載到內(nèi)存里面去。也就是會(huì)有一個(gè)class對象會(huì)被加載到PermGen space里面去。跟heap space是沒有任何關(guān)系的。但是最后報(bào)的是對空間溢出。于是猜測肯定是每請求一次jsp頁面就會(huì)生成一個(gè)對象。
百度了一下,發(fā)現(xiàn)每請求一次JSP頁面,會(huì)產(chǎn)生一個(gè)session對象。在tomcat的web.xml里面有這么個(gè)配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
也就是說每請求一次jsp頁面,會(huì)產(chǎn)生一個(gè)session對象,并且這個(gè)對象30分鐘后才過期。我們計(jì)算了下當(dāng)時(shí)的QPS是5000,也就是說每秒鐘產(chǎn)生5000個(gè)session對象。每分鐘產(chǎn)生300K個(gè)對象,session是個(gè)map對象,比較大,這樣很快就會(huì)把內(nèi)存撐爆。
解決辦法如下:
1.在page指令里添加session=false。
2.把session的過期時(shí)間設(shè)成0。
現(xiàn)在她的loadrunner跑的很穩(wěn)定。工作之后就再也沒有用過jsp了,查jsp的問題還是比較費(fèi)力
相關(guān)文章
jsp基于XML實(shí)現(xiàn)用戶登錄與注冊的實(shí)例解析(附源碼)
這篇文章主要介紹了jsp基于XML實(shí)現(xiàn)用戶登錄與注冊的實(shí)例解析,xml做數(shù)據(jù)庫實(shí)現(xiàn)用戶登錄與注冊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-11-11Jsp連接Access數(shù)據(jù)庫(不通過建立ODBC數(shù)據(jù)源的方法)
Jsp連接Access數(shù)據(jù)庫(不通過建立ODBC數(shù)據(jù)源的方法)...2007-02-02淺談Servlet轉(zhuǎn)發(fā)到JSP頁面的路徑問題(必看)
下面小編就為大家?guī)硪黄獪\談Servlet轉(zhuǎn)發(fā)到JSP頁面的路徑問題(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07servlet實(shí)現(xiàn)文件下載的實(shí)用類分享
servlet文件下載類,為了防止客戶端瀏覽器直接打開目標(biāo)文件,在響應(yīng)頭里加入強(qiáng)制下載的MIME類型,大家參考使用吧2014-01-01