为什么要进行GC回收?
当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下。
什么时候进行GC回收?
1、当CPU空闲的时候
2、执行System.gc()方法的时候
3、堆内存满了以后
GC的算法有引用计数法和可达性分析的算法进行回收
引用计数法:当新建对象就创建一个与之对应的计数器,当对象被使用时计数器就加一,而当不执行此对象时计数器就减一,最终计数器为0的对象将会被回收。
优点:执行速度快
缺点:当存在相互引用时会造成内存泄漏
相互引用
public class test{
public static void main(String []args){
public Object instance=null;
test test1 = new test();
test test2 = new test();
test1.instance = test2;
test.instance = test1;
test1=null;
test2=null;
}
}
内存泄漏:内存泄漏是指无用对象(不再引用对象)持续占有内存,得不到及时的释放,从而造成的内存空间的浪费。
可达性分析法:
通过一系列名为"GC Roots"的对象作为起点,从这些节点往下搜寻,搜索所经过的路径称为引用链,当某个对象没有任何引用链相连时,证明此对象无用,回收(回收不是立即进行的,Java对象在回收前调用finalize()方法——finalize方法通常交给线程优先级较低的线程去处理,有些本应该被回收的对象还会“再生”原因是它复制给了可达对象去引用“借尸还魂法”)。
如何回收?
回收算法有四种:标记清除法、复制算法、标记整理法、分代回收法
标记清除法:
对内存中无用的对象进行标记,然后回收,缺点是会造成内存不连续,空间的浪费。
复制算法:
将内存分成两块,每次只使用其中的一块,当这一块使用完之后就将这一块中存活的对象复制到另一块内存中,已经使用完的内存空间清除。缺点是将内存缩成原来的一半。对于存活较多的对象,要进行复制,效率较低。</