星期一, 8月 19, 2013

解決java permgen space error 的方法

我常用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 版本,我目前測試也沒有碰到過其它的問題,相信這是目前解決這個問題的最佳解法。

星期一, 8月 05, 2013

Oracle ADF 的初次見面感想

第一次看到ADF是在Java Developer 2013 的一個議程,我本來以為這是在講多媒體開發的課程,其實內容是在講以Web為主的快速應用程式開發。

假設我是一個熟練Java 網頁開發的工程師,我現在接到一個需求,要建造一個3-tier(3層)頁面的網站,還要連結資料庫,通常要花三天到一個禮拜。當然這是指在最佳的情況下所達成的目標。因為有時候碰到一個問題我會卡很久,所以開發完通常都還要再加個三到五天做調教。對台灣的客戶來說,很難接受。

Oracle ADF 則是號稱可以20分鐘開發好一個3層頁面的網站,而且在圖表的部分也不需要另外再設定,直接就可以跟資料作連動,我想這會是能滿足工程師開發需求的一個不錯的選擇。