2012-05-03 25 views
0

我與JVM堆麻煩

我們經營與Apache HTTP服務器一個網站和一個Apache Tomcat應用。服務器

所有* .JSP請求Apache HTTP服務器將被重定向到Tomcat服務器(協議:AJP)。

該網站擁有超過10,000 jsp文件

我們有也谷歌搜索設備,它爬行網站每晚。

雖然它爬行時,JVM堆空間上升到8 GB的最大限制。

隨着javamelody,我可以看到堆空間增加模擬到加載的類。

對於分析我採取了堆轉儲。

下面是從蝕MAT報告:


一 「org.apache.jasper.servlet.JspServlet」 的例如通過加載 「org.apache.catalina.loader.StandardClassLoader @ 0x7092c5148」 佔用1個'189'603'328(96.75%)字節。

該存儲器中的「$ java.util.concurrent.ConcurrentHashMap中段[]」通過「」加載一個實例積累。

關鍵詞

java.util.concurrent.ConcurrentHashMap中的$段[]

org.apache.catalina.loader.StandardClassLoader @ 0x7092c5148

org.apache.jasper.servlet.JspServlet


是否與GSA的請求/ s的問題?

爲什麼JVM無法卸載生成的類?

+0

這顯示1.1GB的堆使用。這是消費記憶的唯一主要部分嗎? – Sean

+0

是的,這是唯一的一個。我手動停止了GSA採取堆轉儲,所以這個原因,爲什麼它不是很大。我上週也拿了一個,然後是3.8 GB。 – user1373150

+0

我不會停止GSA採取堆轉儲。如果你這樣做,一些資源可能會被釋放,然後你的堆轉儲不會告訴你整個故事。你在日誌中看到內存不足異常嗎?如果是這樣你可能要添加的啓動參數HeapDumpOnOutOfMemoryError http://stackoverflow.com/q/542979/425406 – Sean

回答

1

它看起來像加載所有的JSP導致問題。

默認情況下,Tomcat將所有加載的JSP保留在內存中,直到Web應用程序停止。

在Tomcat中7可以設置JSP的Servlet maxLoadedJsps參數限制在內存中的JSP的數目。

+0

Thx,Tomcat6還有一個解決方案嗎? – user1373150

+0

不是但是這個功能的後臺端口由於需要修復的一些缺陷以及缺少terest。 –