2012-02-20 68 views
0

我已經部署了一個非常大的應用程序,當我試圖啓動它給的PermGen空間錯誤

「內存不足錯誤」服務器:PermGen的空間

由於正在使用Tomcat 5.5,我在bin文件夾中沒有「setenv.bat」。所以我已經設置了「catalina.bat」中的JAVA_OPTS。我給了喜歡。

set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m -XX:NewSize=192m -XX:MaxNewSize=384m -Djava.awt.headless=true -Dhttp.agent=Sakai -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dsun.lang.ClassLoader.allowArraySyntax=true 

但仍存在問題。有什麼我需要指定或需要改變在上面的片段,以便我的服務器將上升。

謝謝, Jeyaa。

+0

首先,將VisualVM附加到此過程並觀察堆和非堆內存如何增長。你會知道如果512Mo確實被允許到你的Tomcat,那麼你將不得不找到爲什麼... – Grooveek 2012-02-20 10:36:51

+0

我有一個類似的問題。有沒有什麼簡單的方法可以用jvisualvm或其他工具查看classloader泄漏? – 2012-02-20 11:05:12

回答

0

如果您使用的是Sun JVM,最好的方法是下載Visual VM 1.3.3並安裝所有插件。它會讓你看到線程,內存等。

首先啓動Visual VM,然後通過在Visual VM中選擇其JRE來啓動Tomcat。您將能夠看到發生了什麼。

那裏有很多的記憶。你必須在代碼中做一些事情才能做到這一點。

0

我建議你使用的工具JVisualVM其中包括Java中的熱點分佈來檢查你的PermGen空間大小,並期待在GC統計

0

嘗試MaxPermSize參數與-XX:MaxPermSize=1024m翻一番。如果問題仍然存在,那麼還可以嘗試使用-XX:+HeapDumpOnOutOfMemoryError標誌在OutOfMemoryError上啓用堆轉儲,然後使用Eclipse Memory Analyser打開內存轉儲以找出佔用所有內存的內容。記憶傾銷需要很長時間,所以要耐心等待。這可能是因爲你有泄漏需要堵塞。例如,類無休止地生成,或者大量的字符串是intern'ed。

我曾經有過內存泄漏,因爲我從動態生成的字符串中創建了Log4J記錄器,結果發現Log4J攔截了所有這些字符串。這意味着運行3天后,我們的程序在PermGen空間中與OOM崩潰。不好。

0

由於要部署酒井,這些JAVA_OPTS應該是所有你需要一個小的安裝,因爲他們是什麼我已經使用了很多年:

-server -XX:+ UseParallelGC -XX -Xmx1024m :PermSize = 512m -XX:MaxPermSize = 512m -Djava.awt.headless = true -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING = false -Dsun.lang.ClassLoader.allowArraySyntax = true -Dhttp.agent = Sakai

請注意,您希望針對您的特定問題想要增加PermSize設置。