簡體   English   中英

Glassfish / Hibernate的PermGen空間問題

[英]PermGen space issue with Glassfish/Hibernate

我正在Glassfish 3.1上運行GWT + Hibernate應用程序。 幾個小時后,我跑出了Permgen空間。 這沒有任何webapp重新加載。 我正在使用–XX:MaxPermSize=256m –XmX1024m

我接受了這個頁面的建議,發現我泄漏了很多類 - 我所有的Hibernate模型和所有的GWT RequestFactory代理。

上面引用的指南說“檢查鏈條,找到意外參考,並修復代碼”。 說起來容易做起來難。

類加載器始終指向org.glassfish.web.loader.WebappClassLoader的實例。 進一步深入,我發現了許多來自$Proxy135和類似命名對象的引用。 但我不知道還有什么可以貫徹的。

新的類對象被放入PermGen中,從而占用越來越多的空間。 無論你制作PermGen空間有多大,它都將在經過足夠的部署后不可避免地達到頂峰。 你需要做的是采取措施沖洗PermGen,以便你可以穩定它的大小。 有兩個JVM標志可以處理這種清理:

-XX:+CMSPermGenSweepingEnabled

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

-XX:+CMSClassUnloadingEnabled

此設置告訴PermGen垃圾收集掃描對類對象執行操作。 默認情況下,即使在garabage集合期間訪問PermGen空間時,類對象也會獲得免除。

我通過遷移到Tomcat來“解決”這個問題。

有一些好的工具可以幫助解決這個問題,盡管你永遠不會知道它。 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

(我無法查看您提供的鏈接,因為它被websense阻止,所以如果我正在重述任何我道歉的事情)

聽起來你有類加載器泄漏。 這些很難跟蹤,將這些選項添加到實例配置中的JVM選項

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

現在,當您運行應用程序時,您可以查看位於domain / logs文件夾中的jvm.log,查看正在加載和卸載的內容。 很可能,你會看到相同的類一次又一次地加載。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM