JVM的垃圾回收
JVM的垃圾回收
唐喜乐垃圾回收主要关注的是JVM内存中的堆和方法区部分,将内存中没有任何指针指向的对象进行回收,释放内存,避免内存溢出。
标记阶段
判断对象是否存活的算法一般有两种,引用计数算法和可达性分析算法
- 引用计数法:为每个对象保存一个引用计数器,对象被引用和引用失效时进行增减,归零时表示可以进行回收,但是无法处理循环引用的情况。
- 而Java中采用的是可达性分析算法:是以根对象集合(GCRoots)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达,如果对象没有任何引用链,则不可达,为垃圾对象。
清除阶段
jvm的垃圾回收是根据不同年代的特点执行不同的垃圾回收算法,最基本的垃圾回收算法有三种,标记-清除算法、复制算法、标记-整理算法
- 标记-清除算法:从引用根节点开始遍历,标记被引用的可达对象,清除未标记的对象。
缺点:效率不高,进行GC时需要停止整个程序,清理出的内存不连续,需要维护空闲列表。 - 复制算法:将内存空间分为两块,垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。
缺点:需要的空间和开销较大。 常用于存活对象少,垃圾对象多的新生代中。 - 标记-整理算法:从根节点开始标记所有被引用对象,再将所有的存活对象压缩到内存的一端,按顺序排放,然后清理边界外所有的空间。
- 分代收集算法(目前主要使用的算法):新生代对象生命周期短、存活率低,回收频繁,使用复制算法,清理效率高。老年代区域较大,对象生命周期长、存活率高,回收不及年轻代频繁,一般是由标记-清除或者是标记-清除与标记-整理的混合实现。
- 增量收集算法:基础仍是传统的标记-清除和复制算法,通过对线程间冲突的妥善处理,允许垃圾收集线程以分阶段的方式完成标记、清理或复制工作。
- 分区算法:将整个堆空间划分成连续的不同小区间,每一个小区间都独立使用,独立回收,根据目标的停顿时间,每次合理地回收若干个小区间
垃圾回收器
新生代的垃圾回收器
Serial、ParNew、Parallel Scavenger
老年代的垃圾回收器
Serial Old
Parallel Old
CMS回收器:是以实现最短 STW 时间为目标的收集器,采用的是标记清除法,主要有四个步骤,初始标记GC Root能关联的对象,并发标记进行GC Root Tracing,重新标记为了修复和用户进程并发导致的一些对象的变动,最后进行清理。缺点是需要占用一定的CPU资源、无法处理浮动垃圾、产生了碎片空间。
G1回收器:面向服务端的回收器,主要是标记-整理算法,两个区域之间用的是复制算法,比CMS整理空间更快,性能更好,各代储存的地址不连续,需要的GC停顿时间更好预测,不会产生碎片空间。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果