摘要:[開發心得]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