一.內存泄漏java
內存泄漏指對象已經沒有被應用程序使用,可是垃圾回收器沒法移除它們,由於還在被引用着。數據庫
出現內存泄漏的狀況和防止:長生命週期的對象持有短生命週期對象的引用就極可能發生內存泄露,儘管短生命週期對象已經再也不須要,可是由於長生命週期對象持有它的引用而致使不能被回收,這就是java中內存泄露的發生場景。網絡
1.當將HashMap,ArrayList,Vector等集合定義爲靜態的時候,他們的聲明週期將會和應用程序同樣長。他們所引用的全部的對象Object也不能被釋放,由於他們也將一直被Vector等引用着。靜態變量是全局的,GC不會回收。socket
2.事件監聽器,當一個監聽器在使用的時候被註冊,但再也不使用時被反註冊,會出現內存泄漏。工具
3.若是一個類本身管理內存,常一些成員變量引用其餘對象,初始化的時候須要置空。spa
4.JDK6中的substirng()方法容易致使內存泄漏。線程
5.各類鏈接 :
好比數據庫鏈接(dataSourse.getConnection()),網絡鏈接(socket)和io鏈接,除非其顯式的調用了其close()方法將其鏈接關閉,不然是不會自動被GC 回收的。對象
解決方法:經過工具查看泄漏對象到GC Roots的引用鏈,就能找到泄露對象是怎樣的路徑與GC Roots相連並致使垃圾回收器沒法自動回收。遞歸
二.內存溢出生命週期
內存溢出是指應用系統中存在沒法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於虛擬機能提供的最大內存。
出現內存溢出的狀況:
1.內村中加載的數量過大,如一次從數據庫中取出多條數據:
2.棧溢出:線程請求棧的深度大於虛擬機所容許的最大深度(即無限遞歸出現棧溢出)或虛擬機擴展棧時沒法申請到足夠的空間(建立過多的線程出現內存溢出)。
3.堆溢出:不斷地建立對象,並保證GC Root到對象之間有可達路徑來避免垃圾回收機制清除這些對象,那麼在對象數量達到最大堆的容量後就會產生內存溢出。
解決方案:從代碼上檢查是否存在某些對象聲明週期過程,持有狀態的時間過長等,嘗試減小程序中運行期的內存消耗。