Garbage Collection 垃圾收集,简称GC。Java中GC的对象是堆空间和永久区。
复制代码
概念:在标记清除的的基础上改进python
原理:将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,以后,清除正在使用的内存块中的全部对象,交换两个内存的角色,完成垃圾回收算法
缺点:看图bash
优势:ide
一、优秀的吞吐量: GC 标记 - 清除算法消耗的吞吐量是搜索活动对象(标记阶段)所花费的时间和搜索总体 堆(清除阶段)所花费的时间之和。
另外一方面,由于 GC 复制算法只搜索并复制活动对象,因此跟通常的 GC 标记 - 清除算 法相比,它能在较短期内完成 GC。也就是说,其吞吐量优秀。
二、高速分配:GC 复制算法不使用空闲链表。这是由于分块是一个连续的内存空间。比起 GC 标记 - 清除算法和引用计数法等使用空闲链表的分配,GC 复制算法明显快得多。
三、不会发生碎片化
复制代码
总结的时候我以为仍是引入一下分代思想比较清晰post
依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。性能
根据不一样代的特色,选取合适的收集算法优化
问:GC算法中 怎么判断这个对象是不是垃圾对象,是根据可触及性来判断的,那么什么是可触及性呢。ui
答:this
还有一个概念也不能断定这个对象是垃圾对象就是 --可复活的spa
一旦全部引用被释放,就是可复活状态,由于在finalize()中可能复活该对象
复制代码
不过这个通常不使用:
避免使用finalize(),操做不慎可能致使错误。
优先级低,什么时候被调用, 不肯定
什么时候发生GC不肯定
可使用try-catch-finally来替代它经验:避免使用finalize(),操做不慎可能致使错误。
优先级低,什么时候被调用, 不肯定
什么时候发生GC不肯定
可使用try-catch-finally来替代它
复制代码
这里你能够代码试下
public class CanReliveObj {
public static CanReliveObj obj;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("CanReliveObj finalize called");
obj=this;
}
@Override
public String toString(){
return "I am CanReliveObj";
}
public static void main(String[] args) throws
InterruptedException{
obj=new CanReliveObj();
obj=null; //可复活
System.gc();
Thread.sleep(1000);
if(obj==null){
System.out.println("obj 是 null");
}else{
System.out.println("obj 可用");
}
System.out.println("第二次gc");
obj=null; //不可复活
System.gc();
Thread.sleep(1000);
if(obj==null){
System.out.println("obj 是 null");
}else{
System.out.println("obj 可用");
}
}
复制代码
Java中一种全局暂停的现象,全局停顿,全部Java代码中止,native代码能够执行,但不能和JVM交互,多半因为GC引发 Dump线程、 死锁检查、堆Dump。
GC时为何会有全局停顿? 类比在聚会时打扫房间,聚会时很乱,又有新的垃圾产生,房间永远打扫不干净,只有让你们中止活动了,才能将房间打扫干净。
危害:长时间服务中止,没有响应,遇到HA系统,可能引发主备切换,严重危害生产环境。