2013-10-30 66 views
0

運行我的應用程序時,出現OutOfMemory:PermGen空間錯誤。簡要說明:OutOfMemory PermGen空間

從源代碼運行時不會發生該錯誤,但在從部署的.jnlp啓動程序運行時會發生此錯誤。 在通過RMI從我們公司數據庫檢索數據的屏幕中發生錯誤。 從源代碼和啓動器運行都使用相同的RMI URL。 從源代碼和啓動器運行都使用相同的Java版本(6_38)。 該應用程序託管在OC4J 10.1.3中。 發生錯誤時,它不僅會殺死我的應用程序,還會殺死Java控制檯。

我已經將以下選項添加到Application Sever Control中的服務器屬性中,正如其他一些問題中所建議的,但無濟於事。

-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 

記錄在Java控制檯中的錯誤是這樣的,從跟蹤文件中取出的:

Couldn't process record: 
java.lang.OutOfMemoryError: PermGen space 
    at sun.misc.Unsafe.defineClass(Native Method) 
    at sun.reflect.ClassDefiner.defineClass(Unknown Source) 
    at sun.reflect.MethodAccessorGenerator$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.reflect.MethodAccessorGenerator.generate(Unknown Source) 
    at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(Unknown Source) 
    at sun.reflect.ReflectionFactory.newConstructorForSerialization(Unknown Source) 
    at java.io.ObjectStreamClass.getSerializableConstructor(Unknown Source) 
    at java.io.ObjectStreamClass.access$1500(Unknown Source) 
    at java.io.ObjectStreamClass$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.io.ObjectStreamClass.<init>(Unknown Source) 
    at java.io.ObjectStreamClass.lookup(Unknown Source) 

我不知道還有什麼其他的信息可能會有所幫助,我在關於如何繼續的損失。任何指導都會受到歡迎。

回答

0

先嚐試增加燙髮大小,因爲默認值通常太低(主要用於64位jvms)。

所需的參數是-XX:PermSize-XX:MaxPermSize

的256M一個最大值通常是足夠多。

+0

不幸的是,它已經是256M。從我讀過的內容來看,這聽起來像是我在某處發生了內存泄漏,但錯誤消息在這方面沒有幫助(至少對我而言)。該應用程序是一個繼承的應用程序,並且我的工作場所不再僱用原作者。 – Travis

+0

我確實繼續嘗試將它提升到512M,以便看到。它並沒有阻止錯誤的發生,但它確實會導致應用程序凍結並更加順暢地死亡,所以這就是事實。 – Travis

+0

如果確實存在內存泄漏,則可以使用以下2個參數:'-XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = path_to_file'當發生異常時將轉儲內存內容(將路徑設置爲文件)。然後您可以使用像[http://www.eclipse.org/mat/](http://www.eclipse.org/mat/)這樣的應用程序來打開創建的文件並查看問題所在。但請注意,這不是一件容易的事。 – Farid