[開發心得]Java 程式效能調整

摘要:[開發心得]Java 監控程式

在我寫好一個Java的Job程式,用來處理一些特定的常駐執行工作。

但寫好後,放到Server很可能就影響該Server的機器運行,如果上面又不小心run 了其他一些web server。

此時我就會佔用一部分的記憶體,這樣就會影響連線上來時,記憶體夠不夠的問題。

我使用VisualVM去查看,我Java運行後的記憶體與CPU使用量,

 

兩種結果,一是我的記憶體,啟動會到達某個上限,

而我需要一定時間做System.gc()

 

而GC則是告知這個時候,可以適合釋放記憶體,

而並須每一個環結中的資訊,一用完,則馬上設為null,或clear

ArrayList、HashMap使用完,馬上就clear,並設為null

StringBuilder,則setLength(1),並設為null

 

記憶體釋放後,將會使效能提高,

這是我在撰寫大量寫入動作時,耗大量的記憶體,但記憶體未釋放前,會導致記憶體越來越不夠,

所以程式就一直在等記憶體釋放,取得新的記憶體,就會導致效能不快。

 

而gc過於頻繁,則容易使CPU 被我的JAVA吃掉,可能會吃個10%左右。

我改為一分鐘gc一次後,自動降到1%左右。

 

就算沒程式run的情況下,也會使記憶體不斷上升,目前還不知道為什麼,可能有使用Mysql Connection Pool 的關係。

他會一直輪詢連線是否需要釋放吧。

 

使用Connection Pool ,是bind住幾條連線,避免不斷的重新去連線取得連線,導致連線成本過高,為增加速度,就使用mysql connection pool

也避免,要求太多連結,導致mysql很快就到達max connection