【JVM】总结篇之垃圾回收★
文章目录
- 为什么需要GC
- 垃圾回收算法★
-
- 垃圾判断阶段
-
- 引用计数算法
- 可达性分析
-
- GC roots
- 为什么会stop world?
- 垃圾清除阶段
-
- 标记-清除(Mark - Sweep)算法
- 复制(Copying)算法
- 标记-压缩(或标记-整理、Mark - Compact)算法
- 分代收集算法
- 增量收集(Incremental Collecting)算法
- 分区算法 G1 GC使用的算法
- 一些概念
-
- > System.gc()和Runtime.getRunTime().gc()会做什么事情?
- > finalize()方法详解
- > 什么是内存泄漏和什么是内存溢出
- > 并发和并行
- > 安全点(Safepoint) 安全区域(Safe Region)
- > 强引用、软引用、弱引用、虚引用
- 垃圾回收器
-
- 分类
- GC评估指标
- 垃圾回收器有哪些
-
- 组合
- 查看使用GC
- Serial GC 串行回收
- ParNew GC 并行回收
- Parallel GC 吞吐量优先
- CMS 低延迟
-
- CMS 收集过程
- 特点
- 参数
- 对比
- G1 区域化分代式
-
- 为什么需要
- 特点
- 参数
- 分区region
- G1 回收过程
-
- G1回收过程一:年轻代GC
- G1回收过程二:并发标记过程
- G1回收过程三:混合回收
- G1回收可选的过程四:Full GC
- 优化建议
关于垃圾收集有三个经典问题:
- 哪些内存需要回收?
- 什么时候回收?
- 如何回收?
讲讲JVM的gc (携程)
GC是什么?为什么要有GC? (蚂蚁金服)
垃圾回收的优点和原理。 (蚂蚁金服)
垃圾回收机制等 (支付宝)
GC回收的是哪部分的垃圾?(vivo)
垃圾回收的优点和原理?基本原理是什么?(瓜子)
GC是什么?为什么要有GC? (美团)
简述Java垃圾回收机制 (美团)
垃圾回收的优点和原理。(美团)
为什么需要GC
Java中垃圾回收的重点区域是?
- 方法区
- 堆
垃圾回收算法★
GC算法都有哪些?他们之间的区别是什么?(菜鸟)
JVM的常用的GC算法(高得地图)
GC垃圾回收机制算法(数信互融科技发展有限公司)
GC的算法,复制算法和标记清除的优缺点?(迪原创新)
常用的GC算法,如何确定哪些是要被清除的哪些是不能被清除(网易邮箱、美团)
垃圾回收机制的几种回收算法(亚信)
GC算法都有哪些?他们之间的区别是什么?各自的适用场景?(B站)
GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?(腾讯)
如和判断一个对象是否存活?(唯品会)
Java 中垃圾收集的方法有哪些?(苏宁)
你是用什么方法判断对象是否死亡?(滴滴)
如何判断一个对象是否存活? (蚂蚁金服)
垃圾收集策略和算法 (百度)
常见的垃圾回收器算法有哪些,各有什么优劣?(网易)
JVM有哪些回收算法,对应的收集器有哪些? (蚂蚁金服)
垃圾判断阶段
在JVM中究竟是如何标记一个死亡对象呢? 简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。
引用计数算法
对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。
可达性分析
相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题,防止内存泄漏的发生。
GC roots
为什么会stop world?
垃圾清除阶段
当成功区分出内存中存活对象和死亡对象后, GC 接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用内存空间为新对象分配内存。目前在JVM中比较常见的三种垃圾收集算法是标记-清除算法( Mark-Sweep )、复制算法( Copying )、标记 - 压缩算法( Mark-Compact ) 。
标记-清除(Mark - Sweep)算法
复制(Copying)算法
标记-压缩(或标记-整理、Mark - Compact)算法
分代收集算法
JVM的垃圾回收为什么采用分代GC。跟语言有关系吗?(阿里-钉钉)
分代的意义说一下 (阿里-钉钉)
GC分代算法(花旗银行)
说一下gc算法,分代回收说下 (百度)
Java怎么进行垃圾回收的?什么对象会进老年代? 垃圾回收算法有哪些?为什么新生代使用复制算法? (京东)
分代垃圾回收过程? (美团)
GC如何分代的?各代用什么算法回收? (美团)
目前几乎所有的GC都是采用分代收集(Generational Collecting)算法执行垃圾回收的。
增量收集(Incremental Collecting)算法
不想STW
分区算法 G1 GC使用的算法
分代算法将按照对象的生命周期长短划分成两个部分,分区算法将整个堆空间划分成连续的不同小区间。
每一个小区间都独立使用,独立回收。这种算法的好处是可以控制一次回收多少个小区间。
一般来说,在相同条件下,堆空间越大,一次GC时所需要的时间就越长,有关GC产生的停顿也越长。为了更好地控制GC产生的停顿时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理地回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿。
一些概念
> System.gc()和Runtime.getRunTime().gc()会做什么事情?
> finalize()方法详解
finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
大致描述一下finalize流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。
> 什么是内存泄漏和什么是内存溢出
内存溢出OOM