垃圾收集器:java
引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用时。计数器值就增长1;当引用失效时,计数器值就减1;任什么时候刻计数器为0的对象就是不可能再被使用的。算法
注:很难解决java问题中的对象之间的相互循环引用问题。线程
根搜索算法: 经过一系列的名为“”GC Roots”的对象为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots 没有任何的引用链相连时,对象
则证实此对象是不可用的。内存
注:GC Roots对象分为:(1)虚拟机栈(栈帧中的本地变量表)中的引用的对象。虚拟机
(2)方法区中的静态属性引用的对象。效率
(3)方法区中常量引用的对象。基础
(4)本地方法栈中JNI(native方法)的引用的对象。变量
引用:引用数据类型的值存储的是一块内存的起始地址,则表明着一种引用。搜索
Java中将引用分为:强引用、软引用、弱引用、虚引用。
强引用:只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
软引用:系统将要发生内存溢出异常以前,将会把这些对象列进回收范围之中并进行第二次回收。
弱引用:被弱引用关联的对象只能生存到下一次垃圾收集器发生以前。
虚引用:一个对象是否有虚引用的存在,彻底不影响其生存时间,也没法经过虚引用来取得一个对象实例。
方法区回收(永久代回收):废弃常量和无用的类。
废弃常量:当前系统没有任何地方引用这个常量,若是发生内存回收,有必要的话,会被系统清除常量池。
无用的类:(1)该类全部的实例都已经被回收,Java堆中不存在该类的任何实例。
(2)加载该类的ClassLoader已经被回收。
(3)该类的Java.lang.Class对象没有在任何地方被引用,没法经过反射访问该类的方法。
垃圾收集算法: (1)标记-清除算法(最基础):分为标记和清除两个阶段,首先是标记出全部须要回收的对象,在标记完成后,统一回收掉全部被标记的对象。
缺点:(1)效率不高;
(2)空间问题:标记清除后,会产生大量不连续的内存碎片,可能会致使之后的程序须要分配较大对象时,没法找到足够的连续内存,
而触发垃圾收集动做。
(2)复制算法:它将可用内存按容量分为了大小相等的两块,每次只使用其中的一块。当这一块的内存用完后,就将还存活着的对象复制到另外一块上去,
而后再把已使用的内存空间一次清理掉。
(3)标记-整理算法:标记过程与标记-清除算法中的标记同样,而后让全部存活对象都向一端移动,最后直接清理端边界之外的内存。
(4)分代收集算法:当代商业虚拟机都采用 “分代收集” 算法,根据对象的存活周期的不一样将内存划分为几块。将java堆分为新生代和老年代,而后就能够根据各个年代
的特色采用最适当的收集算法。
在新生代中,有大批的对象死亡,只有少数存活,采用复制算法;
在老年代中,对象存活率较高,故采用标记-清除或标记-整理算法。
垃圾收集器分类:
Serial收集器 :在JDK1.3以前是虚拟机新生代收集的惟一选择,这个收集器是最基础的、最悠久的收集器,这个收集器是单线程收集器。
Serial垃圾收集器在进行垃圾收集时,必须暂停其余全部的工做线程,直到它收集结束。