我使用JAVA 5(32位)爲我的應用程序運行在JBoss上。但它只適用於32位。當我們在64位java5上部署它時,它會拋出異常PermGen空間異常
"java.lang.OutOfMemoryError: PermGen space" exception
是否需要任何修補程序? 是否需要更改任何代碼代碼?
在此先感謝。
我使用JAVA 5(32位)爲我的應用程序運行在JBoss上。但它只適用於32位。當我們在64位java5上部署它時,它會拋出異常PermGen空間異常
"java.lang.OutOfMemoryError: PermGen space" exception
是否需要任何修補程序? 是否需要更改任何代碼代碼?
在此先感謝。
我有同樣的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太舊了。
感謝Gigadot, – Navnath
64位Java的指針長度是32位的兩倍。由於大多數對象都是由指針(對其他對象的引用)組成的,因此需要更多的內存來運行。您運行的是64位版本,因爲您的應用程序需要首先分配的空間大於4GB,不是嗎?如果你不這樣做,你最好用一個32位的JVM。
在啓動服務器時使用-XX:MaxPermSize=
。
Java 5.0中的64位引用使用兩倍的引用。在Java 6中,它們默認使用32位引用(請參閱'-XX:+ UseCompressedOops') –
是否有任何補丁需要?
是的,使用默認情況下使用32位引用的64位Java 6或7。 Java 5.0使用64位引用。我不認爲這會被添加到Java 5.0中,因爲它近兩年沒有得到任何支持。 (您可以支付,以支持它)順便說一句
在Sun/Oracle JVM中,對象是8字節對齊的。 JVM使用這個事實來使用32位引用來處理32 GB的內存。 (8 * 4G)。使用直接和內存映射的內存,您可以使用超過32 GB的內存。
與以下參數/值來創建一個環境變量:
varible name = JAVA_OPTS
variable value = -Xmx1000M -XX:MaxPermSize=512m
你甚至檢查過google.com/search?q="java.lang.OutOfMemoryError%3A PermGen空間嗎?有許多命中,包括那些在SO –
@Hermal:它不是**相同:這一個是關於PermGen空間,而另一個是關於堆空間。 –
可能的重複[在Tomcat-Spring-Hibernate Web應用程序中'PermGen空間不足'異常可以做什麼?](http://stackoverflow.com/questions/1124131/what-can-be-done-with- permgen-out-of-space-exception-in-tomcat-spring-hibernate) –