MVP系列文章(四)- GC回收原理分析

前言

MVP系列文章
MVP系列文章(一) - MVC 与 MVP
MVP系列文章(二) - 优化attach()、detach()方法
MVP系列文章(三) - 动态代理优化每次判断 View != null
MVP系列文章(四)- GC回收原理分析
MVP系列文章(五)- 泛型擦除
MVP系列文章(六)- 代码架构与运行时架构
MVP系列文章(七)- 知识梳理

1. GC回收原理分析

前提知识:JVM平台不一样,可能 GC 回收 有区别

第一个需要知道的是:对象什么时候被回收?

判断对象有没有死掉:有2种算法判断对象是否需要回收:
1>:引用计数加1:有一个对象引用它,就给它加1,如果没有对象引用它,就给它减1,当是0时候就回收,一般不用这个;
对于下图中:如果A引用B,B引用A,计数都是1,不会内存泄露,因为目前大部分 JVM平台都不是采用这种回收算法的,而是采用 GcRoot可达分析算法的;


MVP系列文章(四)- GC回收原理分析_第1张图片
引用计数法.png

2>:GcRoot可达分析算法:
A引用B,B引用A,计数器都是1,无法回收,有人会认为内存泄露,其实不一定,会不会内存泄露,还要看你采用的是不是引用计数算法,而这些java代码都是运行在 JVM虚拟上的,而目前大部分 JVM平台都不是采用 引用计数法,可能采用的是 GcRoot算法

回收算法:
标记清除算法:效率低,节省内存;


MVP系列文章(四)- GC回收原理分析_第2张图片
标记清除法.png

复制算法:把需要回收的就放在左边,不需要回收的复制出来,放到右边,最后直接把左边的清除出去即可,效率高,但是浪费内存;


MVP系列文章(四)- GC回收原理分析_第3张图片
复制算法.png

标记整理法:把B清除出去之后,把C移动到B的位置,可以有效利用内存,不会造成内存浪费:


MVP系列文章(四)- GC回收原理分析_第4张图片
标记整理法.png

分代算法
判断对象,如果死了,就回收,分为两步:
1>:把所有需要回收的对象,都加入队列;
2>:调用对象的 finalize() 方法

涉及GC分代年龄:
新生代、老年代、永久代

你可能感兴趣的:(MVP系列文章(四)- GC回收原理分析)