题目:垃圾回收了解多少:
Java的垃圾回收一般在堆上进行,在判断是否可被回收时,因为引用计数法可能出现循环引用的情况,所以Java采取的是可达性分析:就是以GC Roots为起点开始搜索,可达的对象是存活的,不可达的可被回收。GC Roots一般包括:1.局部变量表引用的对象 2.本地方法栈中JNI引用的对象 3.方法区中静态属性引用的对象 4.方法区中常量引用的对象。
垃圾收集算法分为:1.标记清除:就是通过标记来标注是否清除,效率较低且会造成内存碎片 2.标记整理:标记后,所有存活的对象向一端移动,然后清理掉边界以外的区域,虽然不会产生内存碎片,但是效率低 3.复制:就是每次只用一半内存,每次将活着的对象移动复制到另一半上年,然后把之前的那一半直接清理掉,缺点就是每次只用一半的空间。4. 分代收集:可以理解成上面的一种综合运用,新生代使用复制算法,老年代使用标记清除或者标记整理。新生代分为Eden区,from区和to区,当分配空间时,优先分配在Eden区和from区,当进行垃圾回收时,把存活对象复制到to区,之后to区和from区进行调换。每一次回收,没有被清理的对象“年龄”增长一岁,当达到15岁的时候,会转移到老年代。Eden区、from区、to区的比例为8:1:1
常用的垃圾回收期像早期的Serial、ParNew,一个单线程,一个多线程,当然他们也有自己对应的老年代版本。重点聊聊CMS和G1,CMS工作在老年代,采用的是标记清除。工作流程主要分为4个步骤:1.初始标记,简单标记下和GC Roots直接关联的对象 2.并发标记:这个是并发的去做可达性分析 3.重新标记:因为第二步的过程中有一些对象发生了改变,就去重新检测一次 4.并发清除。 G1是一个全能的收集器,它可以理解为抛弃了新生代老年代的概念,而是把堆划分为大小相等的块,称为region,这样每一个region可以独立的进行垃圾回收,他们都有自己的一个set记录着信息,G1的工作流程类似CMS,前三布可以理解为是一样的,最后一步并发清除的时候,因为这一步需要停顿,所以可以通过之前Region的set,来控制时间,做一个筛选回收。
07-22
07-22
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交