之前寫了個(gè)簡(jiǎn)單的jsp做壓力測(cè)試,沒想到出現(xiàn)的一個(gè)問題是當(dāng)壓力比較大的情況,運(yùn)行比較久的話會(huì)出現(xiàn)一個(gè)現(xiàn)象,就是jvm的內(nèi)存幾乎被耗盡,用jprofiler查看會(huì)發(fā)現(xiàn)是有一個(gè)ConcurrentHashMap對(duì)象的內(nèi)存一直在增長(zhǎng),而且沒有釋放的跡象,隨后進(jìn)入Debug模式,跟蹤查找都有誰new了ConcurrentHashMap,因?yàn)闇y(cè)試場(chǎng)景中是個(gè)非常簡(jiǎn)單的jsp頁面,發(fā)現(xiàn)只有jsp的Request session會(huì)創(chuàng)建這個(gè)ConcurrentHashMap,很久沒寫jsp了,猜測(cè)是request session的默認(rèn)超時(shí)時(shí)間太長(zhǎng),所以導(dǎo)致高壓力下(200并發(fā),總共連續(xù)訪問50萬次,jvm內(nèi)存1G)會(huì)出現(xiàn)內(nèi)存一直沒有回收的問題,后來打印了一下request session的默認(rèn)超時(shí)(AS是jboss 4.2.2),是半小時(shí),如果這樣的話確實(shí)是會(huì)有造成上面內(nèi)存一直被占用的現(xiàn)象。
這個(gè)jsp是這樣的,非常簡(jiǎn)單:
<%@ page contentType="text/html;charset=GBK" %>
Just Test.
造成這個(gè)問題的具體原因需要結(jié)合session的機(jī)制來講了,講session機(jī)制的文章相當(dāng)多,感興趣的話可以參見以下兩篇文章:
http://www.builder.com.cn/2007/1123/650439.shtml
http://bbs.chinaunix.net/viewthread.php?tid=1178466
這個(gè)問題怎么說呢,只能說session用的時(shí)候要非常注意吧,畢竟是消耗內(nèi)存資源的,而且通常session都不會(huì)去配置成即時(shí)invalidate,都是有一定的超時(shí)時(shí)間的,在這樣的情況下,如果在超時(shí)時(shí)間范圍內(nèi)出現(xiàn)高訪問量的話,是很有可能會(huì)造成問題的,因此超時(shí)時(shí)間的合理設(shè)置非常重要。
ps: 好久沒玩過jsp和session了,確實(shí)沒太注意這種狀況,對(duì)于熟悉jsp和session機(jī)制的人來說也許這是常識(shí)
了,^_^,見諒見諒。
如果頁面上不需要session的話,可以這么做:
<%@ page session="false" %>