將Java從Windows移植到Linux上會有一堆瑣碎雜事要處理,畢竟是不同的作業系統,不過就算雜事一堆,也比重寫來的方便,而且就算是重寫,移植Java會遇到的問題也不一定不會碰到,總而言之Java的移植性依舊值得稱讚~

1.中文字處理:
Windows上檔案預設都為ASCII格式,而Ubuntu上我選擇UTF-8,結果造成設定檔如果有中文內容,在Ubuntu上讀入的時候會變成亂碼,所以第一步就是得將有中文字的檔案從ASCII轉成UTF-8!

2.Microsoft或Sun幫你做了一些事情:
Microsoft或Sun善意的好心幫我們做了一些事情,而我們通通不知道~
內容有中文字的檔案,不論格式是ASCII還是UTF-8,在Windows上讀入通通一樣~不會有錯
在使用Java的HttpURLConnection時,在Windows上會幫你增加一些基本的Request Property,我不確定多了些什麼,但是保證有語系方面的參數!
你可以在『控制台』>『地區及語言選項』>『標準及格式』選擇你的喜好設定,這邊的喜好設定會改變你HttpURLConnection裡面的基本參數,影響你讀取到的網頁內容!
但是Ubuntu上面並不會幫你改變這些參數,所以如果你不在程式中自己設定,就會按照該網頁伺服器的預設語系丟網頁回來給你,這會造成許多判斷錯誤!
所以~自己乖乖把這幾行加進去比較實際:

執行的scrpit也要修改

3. java.io.FileNotFoundException (Too many open files)
根據不同的Linux發行版本而有所差異,在Ubuntu上面預設限制一個process只能同時開啟1024個檔案,這檔案包含網頁,可以看成你可以連結多少個對象,若超過除了process異常之外,連帶可能連系統都給你搞掛,至少我系統被我弄爛到連reboot的指令都不見了~非得按下主機外殼的重開機紐~XD
相關說明可以參考:
http://www.javaeye.com/topic/74164

 

看起來很誇張,限制了1024個還是超過?超過到需要去改系統設定檔?
這其實很容易發生在網頁伺服器上,例如Tomcat,網路上很多人說他用Tomcat架站,上線人數多一點就會發生這種狀況,造成要去改系統設定檔,可是在我仔細爬了一些文之後,發覺過去會發生這種狀況,可能之一的原因來自於Sun本身,Socket在Linux上似乎無法正常關閉!
想要觀察系統是否有這個現象,可以用lsof -p <PID>,會發現有一堆CLOSE_WAIT的連線
參考:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6215050

上面有一些高手寫了教學說明,不過並沒有討論到這個bug是否在1.6的版本依舊存在,不過我遇到了~我的Crawler似乎在很多時候無法正常關閉!所以我也撞到這問題了~
好在自己研究出了一個解決方法,這方法相當簡單,也相當容易被忽略:把指標指去null後呼叫gc()
靈感來自於最近教一個新學弟寫Java討論到gc(),雖然教學過程中我說這個指令只是建議系統進行garbage collection,完全沒有保證可言,我也從來沒有去理會過它,當然不會把不需要的物件指標指向null~

我在這段method的最後,把sock指向null、br也是指向null,接著在另一個地方寫個thread每隔固定時間執行System.gc(),我的問題就這樣解決了!檔案同時開啟的數量從過去破千、甚至超過系統限制,到現在不到200~
謹記~disconnect()不是萬能

創作者介紹
創作者 kuster 的頭像
kuster

Next Step...

kuster 發表在 痞客邦 留言(0) 人氣()