GC笔记

xiaoxiao2021-02-28  14

判断对象死亡方法

1.引用计数算法:每个对象有个引用计数器,新增引用,计数器+1,引用释放,计数器-1,计数为0时可以回收

2.可达性分析算法:从“Gc Roots”对象延引用链向下搜索,当对象到“Gc Roots”没有任何引用链相连是,此对象不可达,可回收。java中可作为“Gc Roots”的对象:1.虚拟机栈中的引用的对象;2方法区中静态变量应用的对象;3方法区常量引用的对象;4本地方法栈中JIN引用的对象

垃圾回收方法

1.标记-清除算法:是最基础算法,先标记,再统一清除,会产生大量不连续的内存碎片,会导致内存不足而提前进行下一次垃圾收集,影响效率。

2.复制算法:将内存分为两块,每次只使用一块,当一块用完就将还存活的对象复制到另一块,清空当前内存块。(无内存碎片,只需移动堆顶指针,按顺序分配内存,简单高效,代价:内存缩小为原来的一半,复制长生存期对象导致效率降低,因此老年代中不能使用此算法)

3.标记-压缩(整理)算法:与标记清理类似,但不是直接对可回收对象进行清理,而是让存活对象都像一端移动,清理掉端边界以外的内存。

4.分代收集算法:新生代:对象生命周期短,使用复制算法;老年代:对象生命周期长,使用标记-清除或者标记压缩算法;

新生代Eden、From Survivor、To Survivor。新生代使用Minor GC (复制算法)JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块Survivor区域是空闲着的。在Eden( 包括一个 Survivor 区域,这里假设是 from 区域 )区经过一次Minor GC后还存活的对象进入To Survivor然后清理所使用过的 Eden 以及 Survivor 区域,并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代但这也不是一定的,对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代

老年代使用FullGC ( 或称为 Major GC:标记清清除算法 ),Full GC 发生的次数不会有 Minor GC 那么频繁,并且做一次 Full GC 要比进行一次 Minor GC 的时间更长。

方法区hotspot中叫持久代或者永久代,一般不回收

转载请注明原文地址: https://www.6miu.com/read-450188.html

最新回复(0)