內存泄漏:當再也不須要一個對象時,垃圾收集器會回收它;若是不須要的對象一直在產生而不被收回,就稱做「內存泄漏」。數據庫
如下爲本人在工做中遇到的內存泄漏的案例:線程
一、對於大量的請求,使用了Executors.newCachedThreadPool()返回的線程池。對象
這個線程池是沒有界限的,若是每一個線程處理時間較長,並且請求不少,會無限吃內存。內存
二、對於數據庫查詢,使用MyBatis的openSession獲取SqlSession,而後忘記了close。get
SqlSession推薦在try-catch-finally語句的finally語句塊中顯式地調用close()方法io
如下是從網上收集的其餘泄漏場景:object
三、向靜態集合中添加大量元素的引用,這些對象就算再也不使用,也不會被GC主動回收的。從而致使集合內存泄漏。內存泄漏
解決方案:線程池
一、WeakHashMap,存放於其中的鍵值對,若是沒有被使用,會在之後的時間裏被GC自動回收。引用
二、WeakReference: 當一個對象僅僅被weak reference指向, 而沒有任何其餘strong reference指向的時候, 若是GC運行, 那麼這個對象就會被回收.
WeakReference<String> nameRef = new WeakReference<String>(name);
當要得到weak reference引用的object時, 首先須要判斷它是否已經被回收: nameRef.get()
三、SoftReference: 軟引用。
當一個對象具備軟引用時,在內存空間足夠的狀況下不會被回收。若是內存空間即將耗盡、就要拋出oom異常的時候,GC纔會將該引用對象收回。