垃圾回收机制

来源:互联网 发布:知乎无法注册 编辑:程序博客网 时间:2024/06/06 03:41

注意:垃圾回收的是无任何引用对象所占据的内存空间而不是对象本身。

垃圾回收机制就是JAVA虚拟机在空闲时间以不定时的方式回收无任何引用对象占据的内存空间。这就要首先判断哪些是没用对象,有两种方法,引用计数法和可达性分析法。什么时候回收不是程序员决定的。


在JAVA中,程序员不需要显示的去释放一个对象的内存,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或当前内存不足时,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。


垃圾回收可有效防止内存泄漏,有效的使用空闲内存。

内存泄漏是指该内存空间使用完毕之后未回收。


首先要判断哪些是没用的对象。有两种方法:

引用计数法:给对象添加一个计数器,每当有一个地方引用它时,计数器值就加1,任何时刻计数器为0的对象就是不可能再被使用的。但这也会出现一个问题,循环引用的对象是无法识别和回收的。

可达性分析:通过一系列的称为“GC ROOTS”的对象作为起始点,从这些结点开始向下搜索,搜索所走过的路径称为引用链,当一个对象 ,当一个对象到GC ROOTS没有任何引用链相连时,则证明此对象是不可达的。


垃圾收集算法:

 标记清除算法

复制算法

标记整理算法

分代收集算法


垃圾收集器:

Serial收集器:单线程收集器,优点是简单高效,缺点是会给用户带来停顿,因为在它进行垃圾回收时,必须暂停其他所有工作的线程,直到它收集结束。

ParNew收集器其实就是Serial收集器的多线程版本,

Parallel Scavenge收集器是一个新生代收集器,它使用的是复制算法的收集器,又是并行的多线程收集器,

Parallel Scavenge收集器目标则是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那么吞吐量就是99%。

Serial Old 和Parallel Old和CMS是以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是“标记-清除”算法,减少停顿时间的部分是把并发标记的搜索放到一个线程里面了。

G1收集器,对整个堆进行多个大小一样的region,然后按照优先级划分回收区域。




原创粉丝点击