JVM进行GC时候大多数发生在新生代(Eden)
- 新生代(内含有一个Eden区和两个幸存者区,比例为8:1:1)
- 老年代(又称养老代)
- 永久代(JDK1.8后更名为元空间)
分区这有个博客图文结合好理解:https://blog.youkuaiyun.com/qq_19734597/article/details/80958817
GC种类:
- MinorGC(当Eden区满了情况下执行,清理年轻代空间(包括 Eden 和 Survivor 区域))
- MajorGC(主要清理永久代)
- FullGC(清理整个堆空间,清理整个年轻代和老年代,
男女老少都杀了惹)
GC算法分类:
- 复制法(英文忘了):好处就是无碎片空间,坏处就是浪费一半空间.作用于新生代,因为对象存活率较低
- 标记清除法(Mark-Sweep):缺点:空间碎片化,标记扫描两次,时间耗用严重,优点:不需要像复制法一样需要额外可见.
- 标记压缩法(Mark-Compact):缺点就是效率相对较低,多了对象向前移动的时间成本,优点是空间利用率最高,无内存碎片.
分类总结:
- 内存时间效率:复制>标记清除>标记压缩
- 内存空间整齐度:复制=标记压缩>标记清除
- 内存使用率:标记压缩=标记清除>复制
GC四大类型(好像大厂会考吧,):https://www.cnblogs.com/maokun/articles/7618472.html
(注意GC算法类型和GC类型不是一码事 )
判断对象是否为垃圾
-方法:
- 根可达算法(主流):这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。
引用计数算法(已淘汰的历史产物):给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。虽然执行效率高,但是无法解决循环依赖,即对象之间相互引用,JVM无法判断是否为垃圾.