JVM jvm回收算法和回收器,CMS采用哪种回收算法,怎么解决内存碎片问题

垃圾回收算法

  1. 标记清除
    标记——清除算法将垃圾回收分为两阶段:标记阶段和清除阶段。在标记阶段首先通过根节点,标记所有从根节点开始的对象,未被标记的对象就是未被引用垃圾对象。然后,在清除阶段,清除所有未被标记的对象。标记清除算法带来的一个问题是会存在大量的空间碎片,因为回收的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc.

  2. 复制算法
    将现有的内存空间分为两块,每次只使用其中的一块,在垃圾回收是将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。

  3. 标记整理
    复制算法的高效性是建立在存活对象少、垃圾对象多的前提下。这种情况在新生代经常发生,但是在老年代更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活的对象较多,复制的成本也将很高。
    标记-压缩算法是一种老年代的回收算法,它在标记-清除算法的基础上做了一些优化。首先也需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外的所有空间。这种方法即避免了碎片的产生,又不需要两块相同的内存空间。因此,它的性价比比较高

  4. 增量算法
    增量算法的基本思想是,如果一次性将所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以将垃圾收集线程和应用程序交替执行。每次,垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。使用这种方式,由于在垃圾回收过程中,间断性的还执行了应用程序代码,所以能减少系统的停顿时间。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降

垃圾回收器

1. Serial收集器
Serial收集器是最古老的收集器,它的缺点是当Serial收集器想进行垃圾回收的时候,必须暂停用户的所有进程,即stop the world。到现在为止,它依然是虚拟机运行在client模式下的默认新生代收集器,与其他收集器相比,对于限定在单个CPU的运行环境来说,Serial收集器由于没有现成交互的开销,专心做垃圾回收自然获得最高的单线程收集效率。

2. ParNew收集器
ParNew收集器是Serial收集器新生代的多线程实现,注意在进行垃圾回收的时候依然会stop the world,只是相比较Serial收集器而言它会运行多条进程进行垃圾回收。
ParNew收集器在单CPU的环境中绝对不会有比Serial收集器更好的效果,甚至由于存在线程交互的开销,该收集器在通过超线程技术实现的两个CPU的环境中都不能百分百保证超越Serial收集器。当然,随着可以使用的CPU的数量增加,它对于GC时系统资源的利用还是很有好处的。它默认开启的收集线程数与CPU的数量相同,在CPU非常多的环境下,可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。

3.Parallel Scavenge收集器
Parrallel是采用复制算法的多线程新生代垃圾回收器,似乎和ParNew收集器有很多相似的地方。但是Parallel Scanvenge收集器的一个特点是它所关注的目标是吞吐量。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能够提升用户的体验;而高吞吐量则可以最高效率的利用CPU时间,尽快完成程序的运算速度,主要适合在后台运算而不需要太多交互的任务。

4.CMS收集器
CMS收集器是一个比较重要的收集器,现在应用非常广泛,我们重点来看一下,CMS一种获取最短回收停顿时间为目标的收集器,这使得它很适合用于和用户交互的业务。从名字就可以看出,CMS收集器基于标记清除算法实现的。它的收集过程分为四个步骤。

  • 初始标记
  • 并发标记
  • 重新标记
  • 并发清除

注意初始标记和重新标记还是会stop the world ,但是在耗费时间更长的并发标记和并发清除两个阶段都可以和用户进程同时工作。

5.G1收集器
G1收集器是一款面向服务端应用的垃圾收集器。HotSpot团队赋予它的使命是在未来替换掉CMS收集器。与其他GC收集器相比,G1具备如下特点:

  • 并行与并发:G1能够充分利用CPU。多核环境下的硬件优势来缩短stop the world的停顿时间。
  • 分代收集:和其他收集器一样,分代的概念在G1中依然存在,不过G1不需要其他垃圾回收器的配合就可以独自管理整个GC堆。
  • 空间整合:G1收集器有利于程序长时间运行,分配大对象时不会无法得到连续空间而提前触发一次GC.
  • 可预测的非停顿:这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同的关注点,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

CMS:采用标记清除算法

解决这个问题的办法就是可以让CMS在进行一定次数的Full GC(标记清除)的时候进行一次标记整理算法,CMS提供了一下参数来控制:

-XX:UseCMSCompactAtFullCollection -XX:CMSFullGCBeforeCompaction=5

也就是CMS在进行5次Full GC(标记清除)之后进行一次标记整理算法,从而可以控制老年带的碎片在一定数量以内,甚至可以配置CMS在每次Full GC的时候都进行内存的整理。

							***帅气的远远啊***
发布了61 篇原创文章 · 获赞 50 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41585840/article/details/104116574