java記憶體洩漏問題排查(三)
阿新 • • 發佈:2018-11-10
這個系列應該改個名字,叫做java 命令列視窗(執行在windows環境下)突然退出,但是埠號存在,java虛擬機器程序也存在。
昨天出差到客戶現場一番排查。排除了之前的一系列推測(根據程式日誌發現,程式異常退出是有規律的,每3小時一次,在57分異常退出)
- 記憶體溢位:程式退出後未生成dump檔案,且用jconsole顯示記憶體一直正常。
- 客戶計算機是否有異常:檢視系統日誌、cpu,記憶體(發生問題時間點的)都一切正常。
- 網路請求http連線未釋放,連線池佔滿假死:程式已經優化,排除httpclient使用問題導致連線異常,且在cmd下檢視netstat顯示正常。
- 資料庫連線未回收,卡死:優化資料庫連線配置引數,並檢視發生故障時的連線,顯示正常。
就在我一籌莫展,幾近放棄的時候客戶UPS有問題,意外讓伺服器重啟使我找到了問題的所在。
程式重啟後,有些開機自動執行程式,這時候我手賤在cmd下用命令netstat -ano|findstr 8083(我的程式埠),竟然以為的發現,是啟動著的。。。。。。。。。。。而我的程式是沒有配置開機自動執行的,這個時候我才想起來會不會是有其他程式跟我是一樣的埠。(我之前也不是沒有想到過端口占用的問題,但是我的命令列程式在埠被佔用狀況下,執行後沒幾秒就會自動退出,然後在錯誤日誌種提示 Address is already benn used,然而這個搞笑的是,我的程式如果先啟動,另外一個也是用8083埠的程式後啟動,他是個exe程式,不會自動退出,但是另外會啟動一個守護程序,每3個小時檢視一次,然後把我的程式給幹掉了,把他的程式給啟動起來)因此每次我檢視netstat的時候,發現8083埠還在,給我問題排查產生了誤解。現在想想問題原因很坑爹,但是排查過程當中也不是沒有收穫,在這些彎路之中,更深入的瞭解了jvm、httpclient連線池、資料庫連線池相關的知識。