Week_09 作业
java 虚拟机的垃圾回收
对共享的数据区(堆)中的不在使用的对象进行回收。
回收策略
标记
从线程栈中的局部变量找
从方法区的静态变量找
从上述找到的对象中查看是否有其他对象的引用,有则标记
标记了表示不能被回收,否则可回收
清除
清理:清除垃圾对象,将其内存放入空闲列表,以便后续分配使用
压缩:将清除后出现空洞的堆空间,进行压缩。(将存活对象拷贝到连续空间内,保证堆空间的连续性)
复制:将堆空间分成 2 块,一块用于创建对象,当这块空间用完后,将其中还活着的对象复制到另一个空间,完成清除工作
分代垃圾回收
java 以复制的方式进行垃圾回收,具体回收过程如下:
将堆内存分为两大部分:新生代和老年代
新生代中又分为:Eden 区,From 区,To 区
对象内存分配时,在 eden 区进行分配
当 eden 区对象内存分配达到一定比例或者满时,触发垃圾回收
将 eden 区无用对象进行回收,剩余有用对象被复制到 From 区,然后清空 eden 区
第一次回收结束,程序继续运行
新的对象又在 eden 区中产生,且再次触发 gc,重复上述步骤
如果 From 区放不下时,将 Eden 和 From 区所有对象都复制到 To 区,同时清空 Eden 区和 From 区
第二次回收结束,程序继续运行
eden 区再次触发 gc,此时会将 eden 和 to 区对象复制到 from 区,清空 eden 和 to 区
第三次回收结束,程序继续运行,重复往返的执行上述过程
如果有些对象在多次 gc 后,还 From 区或者 To 区存在,则说明该对象生命周期长,将这些对象复制到老年代
当老年代空间也满时,触发一次新生代和老年代的全量 gc
垃圾回收算法
串行回收器:应用程序并行执行,有 GC 时,挂起应用程序线程。然后启动一个垃圾回收线程进行回收,回收完毕后,应用程序线程继续执行
并行回收器:在多核时代,为了提高回收效率,用多个回收线程进行回收工作
并发回收器 CMS:将回收过程进一步细化,标记过程分为初始标记,并发标记,重标记,并发清理 4 个阶段。初始标记时,进行 stop the world,短时间内标记完。之后进入并发标记阶段,用户线程和 gc 线程同时运行。在并发标记的过程中,又有新的对象产生,之前标记的可能不准,因此进入重标记阶段。在该阶段,为了防止误删,会进行 stop the world。之后将标记好的进行并发清理
G1 回收器:将 eden 区,from,to 区,老年期分的粒度更细,然后对这些区域进行控制,回收时,不必整块内存区去遍历
评论