因為項目需要我們引進了mycat,並監控mycat的使用情況。在測試一段時間后發現cpu占用了100%,導致部分機器無法連接mycat。通過jstat -gcutil pid 1000 10,可以清楚的看到jvm在1秒鍾做了4次full gc並且每次full gc后沒有任何的內存回收。
jmap -histo:live pid 查看具體存活對象數量及占用內存情況:(由於內存泄漏之前的歷史數據沒有保存,以下是修復后的對象信息)
修復之前發現 JDBC4PreparedStatement 和 JDBC4ResultSet instances達到了3百多萬個實例,內存占用了1g,而我們使用mycat 的堆內存最大設置了2g。問題原因是:由於特定的業務場景,我們繼承了RuleAlgorithm並將路由規則寫到了數據庫中,應用基於數據庫的路由表進行路由,由於路由采用jdbc的查詢方式,並且沒有關閉Statement和ResultSet導致了這個兩個對象內存泄漏
