2011-09-12 55 views
4

我使用JAVA 5(32位)爲我的應用程序運行在JBoss上。但它只適用於32位。當我們在64位java5上部署它時,它會拋出異常PermGen空間異常

"java.lang.OutOfMemoryError: PermGen space" exception 

是否需要任何修補程序? 是否需要更改任何代碼代碼?

在此先感謝。

+0

你甚至檢查過google.com/search?q="java.lang.OutOfMemoryError%3A PermGen空間嗎?有許多命中,包括那些在SO –

+0

@Hermal:它不是**相同:這一個是關於PermGen空間,而另一個是關於堆空間。 –

+0

可能的重複[在Tomcat-Spring-Hibernate Web應用程序中'PermGen空間不足'異常可以做什麼?](http://stackoverflow.com/questions/1124131/what-c​​an-be-done-with- permgen-out-of-space-exception-in-tomcat-spring-hibernate) –

回答

7

我有同樣的prolem當我運行在Tomcat或Jetty我的Web應用程序。永久生成內存用於加載類,其思想是「類永久加載」。由於我使用了相當多的庫和Spring框架,所以當我重新部署Web應用程序幾次而不重新啓動Servlet容器時,這些內存會非常快速地填滿。

我發現增加最大永久代數是不夠的。您還需要允許垃圾收集在運行時刪除未使用的類,否則它將被填滿並拋出PermGen空間異常。下面是我加爲我的servlet容器的JVM選項,

-XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled 

-XX:MaxPermSize用於設置永久代的最大值。這應該大於默認大小。

-XX:+CMSClassUnloadingEnabled該選項用於允許JVM在運行時卸載該類。默認情況下,類卸載是禁用的。對於Java 5,請閱讀this

-XX:+UseConcMarkSweepGC,爲了類上傳選項起作用,這個選項也必須設置(ref

此外,你應該考慮升級您的JVM版本。 Java 5太舊了。

+0

感謝Gigadot, – Navnath

3

64位Java的指針長度是32位的兩倍。由於大多數對象都是由指針(對其他對象的引用)組成的,因此需要更多的內存來運行。您運行的是64位版本,因爲您的應用程序需要首先分配的空間大於4GB,不是嗎?如果你不這樣做,你最好用一個32位的JVM。

在啓動服務器時使用-XX:MaxPermSize=

+2

Java 5.0中的64位引用使用兩倍的引用。在Java 6中,它們默認使用32位引用(請參閱'-XX:+ UseCompressedOops') –

2

是否有任何補丁需要?

是的,使用默認情況下使用32位引用的64位Java 6或7。 Java 5.0使用64位引用。我不認爲這會被添加到Java 5.0中,因爲它近兩年沒有得到任何支持。 (您可以支付,以支持它)順便說一句

在Sun/Oracle JVM中,對象是8字節對齊的。 JVM使用這個事實來使用32位引用來處理32 GB的內存。 (8 * 4G)。使用直接和內存映射的內存,您可以使用超過32 GB的內存。

0

與以下參數/值來創建一個環境變量:

varible name = JAVA_OPTS 

variable value = -Xmx1000M -XX:MaxPermSize=512m