新生代:新生代会频繁触发 MinorGC 进行垃圾回收算法
注意:默认内存比值为 8:1:1,且每次 ServivorFrom 和 ServivorTo,会交换位置的!性能
老年代:当新生代的对象,被 gc 十五次以后,都还幸存,就存放到这里。(若是new 的对象很大,也会直接放到这)优化
永久代(方法区):存放着 jre 中自带的一些类的信息,静态变量,常量等数据,不过7以后,常量池都放到堆中去了!(这也就说明了,为何它叫永久代,由于这些东西,咱们不须要管,因此8以后,把它用元空间取代了,由于它都不和咱们 new 出来的对象在一块,因此干脆把元空间归于 本地内存!)对象
引用计数法:若是一个对象实例,没有引用地址指向它,那么他的引用计数就是0,则断定为垃圾。内存
可达性分析:为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。经过一系列的“GC roots” 对象做为起点搜索。若是在“GC roots”和个对象之间没有可达路径,则称该对象是不可达的。基础
要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要通过两次标记 过程。两次标记后仍然是可回收对象,则将面临回收。变量
过程:复制 => 清空 => 交换垃圾回收
复制:首先把 Eden 和 ServivorFrom 的幸存者,复制到 ServivorTo 区域,而且让幸存者年龄 +1,搜索
,同时判断幸存者年龄,若是年龄达到了 15 ,就转移到老年区!循环
清空:接着清空 Eden 和 ServivorFrom
交换:交换 ServivorFrom 和 ServivorTo ,以实现循环清理,直到年龄达到 老年区。
优势:耗时较短,且不会有内存碎片。
缺点:须要额外的一块空白的区域,进行幸存者转移。
总结:空间换时间。适合存活率低的区域(新生代),存活率低,须要复制的幸存者就少,性能消耗的就少。
过程:扫描一次,进行标记,再扫描一次,进行清除。
标记:GCRoot算法,判断是否为垃圾,可清除。
优势:不须要额外的空间,进行幸存者转存。
缺点:耗时较长,并且会留下一块块的内存碎片!
总结:时间换空间。适合存活率高的区域,(老年代),幸存者较多,复制的话,太浪费性能了。
过程:在前者的基础上,又多了一次扫描,而后将 幸存者 和 内存碎片 给整理到各自的整块的领域。
优势:不须要额外的空间,切没有内存碎片残余。
缺点:耗时长!
总结:和前者相同,不过不宜频繁使用!
因为 MajorGC 的内存碎片的缘故,若是能够经过判断 MajorGC 进行多少次后,内存碎片会比较多,而后进行一次内存碎片整理,应该算是一种优化!