2011-04-01 46 views
6

我在Glassfish 3.1運行的GWT + Hibernate的應用程序。幾個小時後,我耗盡了Permgen的空間。這是沒有任何webapp重新加載。我正在運行–XX:MaxPermSize=256m –XmX1024mPermGen的空間的問題在GlassFish /休眠

我接受了this page的建議,發現我在泄漏大量的類 - 我所有的Hibernate模型和所有的GWT RequestFactory代理。

上面引用導向說「考察鏈,找到偶然參考,並修復代碼」。說起來容易做起來難。

的類加載器總是指向回org.glassfish.web.loader.WebappClassLoader一個實例。進一步挖掘,我發現從$Proxy135和類似命名的對象很多參考。但我不知道還有什麼可以貫徹。

+3

嘗試使用此參數:'-XX:+ UseConcMarkSweepGC -XX:+ CMSPermGenSweepingEnabled -XX:+ CMSClassUnloadingEnabled -XX:MaxPermSize = 256m' – 2011-04-01 05:09:52

回答

4

我移動到Tomcat 「解決」 這一點。

22

新的類對象將會放入PermGen的,因此佔據了不斷增加的空間量。無論您創建PermGen空間的規模有多大,在部署完成後都不可避免地被淘汰出局。您需要做的是採取措施沖洗PermGen,以便您可以穩定其大小。有兩個JVM標誌可以處理這種清理:

-XX:+CMSPermGenSweepingEnabled 

此設置包含垃圾收集運行中的PermGen。默認情況下,PermGen空間永遠不會包含在垃圾回收中(因此無限制地增長)。

-XX:+CMSClassUnloadingEnabled 

這個選項告訴PermGen的垃圾收集清掃採取類對象的動作。默認情況下,即使在garabage集合期間訪問PermGen空間時,類對象也會獲得豁免。

+0

但是我看到這種情況只發生在一次部署之後。爲什麼我的所有hibernate/GWT代理仍然被應用服務器引用? – 2011-04-01 13:51:03

+1

嗨,我還有一個問題,我應該在哪裏添加這些命令? – Minutis 2012-02-18 09:14:48

+0

在Glassfish 3中,在標籤'java-config'中編輯glassfish/domain_folder/config/domain.xml,應該有類似的配置,只需添加新的'jvm-options'元素 – Jacopofar 2013-06-27 13:00:49

2

(所以如果我重申什麼我道歉我無法查看你提供的,因爲它是通過阻斷Websense的鏈接)

這聽起來像你有一個類加載器泄漏。這些都是難以追查,在實例配置

-XX:+PrintGCDetails 
-XX:+TraceClassUnloading 
-XX:+TraceClassLoading 

現在,當你運行你的應用程序,你可以看看位於域/日誌文件夾中的jvm.log,看看什麼是添加這些選項的JVM選項上貨和下貨。大多數情況下,你會看到一遍又一遍地重複加載同一個類。

一個很好的罪魁禍首是JAXB,特別是如果你一遍又一遍創建一個新的JAXBContext。

4

有一些確定的工具來解決這個問題,但你永遠不會知道。 JDK(1.6 u1及以上版本)附帶jhat和jmap。這些工具將會有很大幫助,特別是如果您使用jhat JavaScript查詢支持。

參見:

http://blog.ringerc.id.au/2011/06/java-ee-application-servers-learning.html

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

http://www.mhaller.de/archives/140-Memory-leaks-et-alii.html

http://blogs.oracle.com/sundararajan/entry/jhat_s_javascript_interface