最近項目忽然出現了「java.lang.OutOfMemoryError: PermGen space」的錯誤,其實關於 PermGen space 錯誤的解釋,網上已經有不少了,摘錄一段 java
PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,
這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen
space中,它和存放類實例(Instance)的Heap區域不一樣,GC(Garbage Collection)不會在主程序運行期對
PermGen space進行清理,因此若是你的應用中有不少CLASS的話,就極可能出現PermGen
space錯誤,這種錯誤常見在web服務器對JSP進行pre compile的時候。若是你的WEB APP下都用了大
量的第三方jar, 其大小超過了jvm默認的大小那麼就會產生此錯誤信息了。 web
java其實並不推薦大量使用反射來構造對象 spring
不少人都把這個錯誤的緣由,很大程度上都歸結於使用了spring hibernate……,由於他們動態產生類(java反射),致使溢出(spring在AOP的時候使用CBLIB會產生不少類,hibernate反射也會產生不少類) tomcat
緣由是: 服務器
原來SUN的JVM把內存分了不一樣的區,其中一個就是permenter區用來存放用得很是多的類和類描述。原本SUN設計的時候認爲這個區域在JVM啓動的時候就固定了,但他沒有想到如今動態會用得這麼普遍。並且這個區域有特殊的垃圾收回機 制,如今的問題是動態加載類到這個區域後,gc根本沒辦法回收! 框架
解決方法不少,就不貼上了··· jvm
我的以爲,出現這個問題的緣由,跟這些框架的使用,是存在必定關係的··· spa
關於ORM框架反射的問題,其實應該用泛型+繼承,或者泛型工廠模式來實現,而不是無腦反射。
hibernate
(PS: 若是tomcat運行多個系統,將相同的第三方jar文件移置到tomcat/shared/lib目錄下,這樣能夠達到減小
jar 文檔重複佔用內存的目的。) 設計