我常用JBoss進行網頁開發,它有個功能是auto deploy,也就是我只要修改一點點的程式碼,然後它就會偵測到有最新的程式碼並重新部署一遍。這個功能我相信Tomcat或是其它Java Web Container 也有才對。
自動重新部署的功能自然是很方便,問題是不斷的重覆部署後Server總是會當掉,並且跳出一個error :out of memory , java permgen space。我第一次碰到這個問題時,別人只是叫我關掉並重開Web Container,問題是要是這個是正式在營運的主機豈不是出大包 ? 好笑的是這個問題公司還真的沒有人跳下去解它,任憑使用者哀嚎。我實在是看不下去,只好花時間Google 查這個問題。
原來是 Java 的 Hotspot VM 內部設計的問題,它內部設計成年輕代、老年代、永久代(Permanent Generation),放入永久代的class是不會被釋出的,但是每次Reload web container 卻會把新的class放到永久代。一路放下去的結果就滿出來,爆掉了,於是Web Container就不能運作,彈出permgen error。
以前查到的解決方法就是用 jvm 參數加大heap size,或是計算載入時用了多少 class,但是都不能真正解決這個問題。因為這個遲早都會爆掉。
我查到一個blog,它是非常深入 jvm 的機制去講解為什麼會產生出這個錯誤,以及程式碼要怎麼寫會比較好。但是我覺得它少了開發上的自由度,以及我必需要改寫整個程式的架構是曠日廢時的。所以我就沒有採用這個作法。
有個觀念要理解,Java VM 不只是Oracle(以前是Sun)有實作,像是IBM,或是其它公司團體都有出他們的VM,只是Oracle的VM比較為大家所知。
所以我們只要找到一個沒有permanent generation space 的VM就好了,目前我所採用的VM叫jRockit,它號稱是速度最快的JVM,目前有出Windows 與 Linux 版本,我目前測試也沒有碰到過其它的問題,相信這是目前解決這個問題的最佳解法。
自動重新部署的功能自然是很方便,問題是不斷的重覆部署後Server總是會當掉,並且跳出一個error :out of memory , java permgen space。我第一次碰到這個問題時,別人只是叫我關掉並重開Web Container,問題是要是這個是正式在營運的主機豈不是出大包 ? 好笑的是這個問題公司還真的沒有人跳下去解它,任憑使用者哀嚎。我實在是看不下去,只好花時間Google 查這個問題。
原來是 Java 的 Hotspot VM 內部設計的問題,它內部設計成年輕代、老年代、永久代(Permanent Generation),放入永久代的class是不會被釋出的,但是每次Reload web container 卻會把新的class放到永久代。一路放下去的結果就滿出來,爆掉了,於是Web Container就不能運作,彈出permgen error。
以前查到的解決方法就是用 jvm 參數加大heap size,或是計算載入時用了多少 class,但是都不能真正解決這個問題。因為這個遲早都會爆掉。
我查到一個blog,它是非常深入 jvm 的機制去講解為什麼會產生出這個錯誤,以及程式碼要怎麼寫會比較好。但是我覺得它少了開發上的自由度,以及我必需要改寫整個程式的架構是曠日廢時的。所以我就沒有採用這個作法。
有個觀念要理解,Java VM 不只是Oracle(以前是Sun)有實作,像是IBM,或是其它公司團體都有出他們的VM,只是Oracle的VM比較為大家所知。
所以我們只要找到一個沒有permanent generation space 的VM就好了,目前我所採用的VM叫jRockit,它號稱是速度最快的JVM,目前有出Windows 與 Linux 版本,我目前測試也沒有碰到過其它的問題,相信這是目前解決這個問題的最佳解法。
沒有留言:
張貼留言