java程序员面试宝典:java中的垃圾回收,内存泄漏。

1.GC

java语言中的GC(Garbage Collection)主要作用时回收程序中不再使用的内存。

具体而言垃圾回收器主要负责三项任务:分配内存;确保被引用的对象内存不被错误的回收;回收不再被引用的对象的内存控件

对对象而言:

如果没有任何变量取引用它,(该对象所占内存就是不可达的),那么该对象不可能被程序访问,就可以认为时垃圾信息,可以被回收。只要有一个以上的变量引用该对象(该对象所占内存是可达的),该对象就不会被回收。

对于垃圾回收器而言:

它使用有向图来记录和管理堆内存中的所有对象,通过有向图就可以识别哪些对象时可达的,哪些对象时不可达的。索域的“不可达”的对象都是可以被垃圾回收的。

举例:

public class Test{

public static void main(String[]a){

Integer i1=new Integer(1);

Integer i2=new Integer(2);

i2=i1;

//some other code

}

}

上述代码执行到i2=i1后,内存的引用关系如图:

此时,如果垃圾回收器正在进行垃圾回收操作,再遍历上述的有向图时,资源2所占用的内存是不可达的,垃圾回收器认为这部分内存已经不在被使用,因此可以回收该内存了

扫描二维码关注公众号,回复: 2048136 查看本文章

注意几个相关问题:

1,一个对象成为垃圾,只有再下次垃圾回收器运行时,才可以被回收,而不是马上被清理。

2.finalize方法实在对象空间被回收前调用的

3.由于垃圾回收器的存在,java语言本身没有给开发人员提供显示释放已经分配好了的内存的方法,也就是说,开发人员不能实时地调用垃圾回收器对对象进行垃圾回收,但是开发人员可以通过调用System.gc()方法来“通知”垃圾回收器运行,当然,JVM也不能保证垃圾回收器就会马上运行。


2.内存泄漏

内存泄漏是指:一个不被程序使用的对象或者变量还在内存中占有存储空间。

java中引入了垃圾回收机制能不能避免这样的问题呢?

对于java语言而言,判断一个内存空间是否符合垃圾的标准有两个:第一,给对象赋值null,以后再没有被使用过了;第二,给对象赋予了新值,重新分配了内存空间。

一般来讲,内存泄漏主要有两种情况:一是再堆中申请的空间没有被释放;二是对象不被使用了,但是还是再内存中保留着。我们的垃圾会收机制,就有效解决了第一种情况,但是对于第二种情况,垃圾回收机制也无法保证可以回收这部分不再使用的对象。所以java语言中是存在内存泄漏的。

猜你喜欢

转载自blog.csdn.net/handsome2013/article/details/80959104