1.什么是垃圾回收?
垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。
注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身。换言之,垃圾回收只会负责释放那些对象占有的内存。对象是个抽象的词,包括引用和其占据的内存空间。当对象没有任何引用时其占据的内存空间随即被收回备用,此时对象也就被销毁。但不能说是回收对象,可以理解为一种文字游戏。
垃圾回收一般是回收堆中的内存!可以防止内存泄露!
2.内存泄露:指内存空间使用完成后没有回收;Java的内存泄露表现为一个对象的生命周期超过了程序需要他的时间长度,通俗说:内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用);可以将引用=null来解决,但是不是什么情况都行。
例子:
Vector v = new Vector( 10 );
for ( int i = 1 ;i < 100 ; i ++ ){
Object o = new Object();
v.add(o);
o = null ;
}
在这个例子中,代码栈中存在Vector 对象的引用 v 和 Object 对象的引用 o 。
在 For 循环中,我们不断的生成新的对象,然后将其添加到 Vector 对象中,之后将 o 引用置空。问题是当 o 引用被置空后,
如果发生 GC ,
我们创建的 Object 对象是否能够被 GC 回收呢?
答案是否定的。
因为, GC 在跟踪代码栈中的引用时,
会发现 v 引用,而继续往下跟踪,就会发现 v 引用指向的内存空间中又存在指向 Object 对象的引用。也就是说尽管 o 引用已经被置空,
但是 Object 对象仍然存在其他的引用,是可以被访问到的,所以 GC 无法将其释放掉。
如果在此循环之后, Object 对象对程序已经没有任何作用,
那么我们就认为此 Java 程序发生了内存泄漏。
发生内存泄漏的情况:https://blog.csdn.net/wwd0501/article/details/50544222
3.垃圾回收机制的算法
主流:Generational Collection(分代收集算法):
将堆分为新生代(Young Generation)和老年代(Old Generation),新生代每次垃圾回收都有大量的对象需要被回收;而老年代每次收集只有少量的对象需要被回收;所以针对他们,可以有不同的垃圾回收算法;
对于新生代,一般采用copying算法,将新生代按照8:1:1的比例分为Eden区、survivor0和survivor1,对象一般在Eden区里面产生,当Eden区满了时,将Eden区存活的对象复制到survivor0中,然后将Eden清空;当survivor0满了时,将Eden和survivor0的存活对象copy到survivor1中,然后清空Eden和survivor0;然后将survivor0和survivor1交换,保持survivor1为空,如此反复;
当survivor1放不下Eden和surviovr0的存活对象的时候,则将存活对象放入到老年代中;当老年代满了后,则启动Full GC,新、老年代都进行垃圾回收;
image.png
网友评论