JVM系列之内存泄漏
生活随笔
收集整理的這篇文章主要介紹了
JVM系列之内存泄漏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自http://www.wolfbe.com/detail/201609/378.html
摘要:在Java中,內存泄漏是指程序中存在某些對象已經不會再被使用,但由于仍被其它對象引用而造成內存不能被及時釋放,從而造成內存被浪費。 什么是內存泄漏?在Java中,內存泄漏是指程序中存在某些對象已經不會再被使用,但由于仍被其它對象引用而造成內存不能被及時釋放,從而造成內存被浪費。我們知道Java創建一個對象后,就會在堆內存中給這個對象分配一塊內存,JVM會監控所有的對象創建、賦值等過程,JVM持有一個記錄對象引用的一個有向圖,起點為Root,把一個對象賦值給某個引用,JVM就會給這個對象在引用有向圖中加多上一條路徑。當一個對象不再被引用,即通過Root到這個對象不可達,在下一次GC到來時就可能回收這個對象。 舉個例子,如下所示:?
| 1234567 | public static void main(String[] args){?????Object obj1 = new Object();?????Object obj2 = new Object();?????obj2 = obj1;?????...} |
調用obj2=obj1,使obj2引用指向對象OBJ1,OBJ2對象由于沒有引用指向,那么如果下一次GC到來,那么就可能會回收OBJ2對象(因為垃圾回收的過程是不確定的,當一個對象沒有被引用了,那么說明這個對象可以被回收,但不能保證一定會被回收掉)。
如果在程序中確定不再使用OBJ2對象,但卻被其它對象引用,那么就會出現內存泄漏的現象,如下所示:?
| 1234567 | Object obj1 = new Object();Object obj2 = new Object();Vector v=new Vector(10);v.add(obj1);v.add(obj2);...obj2 = null; |
代碼中obj2 = null確定會釋放obj2對OBJ2對象的引用,但是變量v仍然保持著對OBJ2對象的引用,那么OBJ2對象不會被GC回收。
我們在寫程序時應該正確地釋放不再引用的對象,尤其是在一些靜態集合、數據庫連接、內部類的代碼中,應當檢查是否存在不可用對象的引用仍然被持有,避免因為無法釋放不可用對象而造成內存的浪費。
贊?NaN??分享
總結
以上是生活随笔為你收集整理的JVM系列之内存泄漏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础-注解Annotation原
- 下一篇: Intellij 14快捷键