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所占用的内存是不可达的,垃圾回收器认为这部分内存已经不在被使用,因此可以回收该内存了
注意几个相关问题:
1,一个对象成为垃圾,只有再下次垃圾回收器运行时,才可以被回收,而不是马上被清理。
2.finalize方法实在对象空间被回收前调用的
3.由于垃圾回收器的存在,java语言本身没有给开发人员提供显示释放已经分配好了的内存的方法,也就是说,开发人员不能实时地调用垃圾回收器对对象进行垃圾回收,但是开发人员可以通过调用System.gc()方法来“通知”垃圾回收器运行,当然,JVM也不能保证垃圾回收器就会马上运行。
2.内存泄漏
内存泄漏是指:一个不被程序使用的对象或者变量还在内存中占有存储空间。
java中引入了垃圾回收机制能不能避免这样的问题呢?
对于java语言而言,判断一个内存空间是否符合垃圾的标准有两个:第一,给对象赋值null,以后再没有被使用过了;第二,给对象赋予了新值,重新分配了内存空间。
一般来讲,内存泄漏主要有两种情况:一是再堆中申请的空间没有被释放;二是对象不被使用了,但是还是再内存中保留着。我们的垃圾会收机制,就有效解决了第一种情况,但是对于第二种情况,垃圾回收机制也无法保证可以回收这部分不再使用的对象。所以java语言中是存在内存泄漏的。