目前所有的新生代gc都是需要STW的:
Serial:单线程STW,复制算法
ParNew:多线程并行STW,复制算法
Parallel Scavange:多线程并行STW,吞吐量优先,复制算法
Serial old:标记-整理
parallel old:标记-整理
cms:标记清除算法
简要对比三种基本算法:
关于时间开销:
mark-sweep:mark阶段与活对象的数量成正比,sweep阶段与整堆大小成正比
mark-compact:mark阶段与活对象的数量成正比,compact阶段与活对象的大小成正比
copying:与活对象大小成正比
如果把mark、sweep、compact、copying这几种动作的耗时放在一起看,大致有这样的关系:
compaction >= copying > marking > sweeping
还有 marking + sweeping > copying
mark-sweep | mark-compact | copying | |
速度 | 中等 | 最慢 | 最快 |
空间开销 | 少(但会堆积碎片) | 少(不堆积碎片) | 通常需要活对象的2倍大小(不堆积碎片) |
移动对象? | 否 | 是 | 是 |
mark-sweep:mark阶段与活对象的数量成正比,sweep阶段与整堆大小成正比
mark-compact:mark阶段与活对象的数量成正比,compact阶段与活对象的大小成正比
copying:与活对象大小成正比
如果把mark、sweep、compact、copying这几种动作的耗时放在一起看,大致有这样的关系:
compaction >= copying > marking > sweeping
还有 marking + sweeping > copying
垃圾回收算法:
- 引用计数:一个对象被引用计数器加一,取消引用计数器减一,引用计数器为0才能被回收。优点:简单。缺点:不能解决循环引用的问题,比如A引用B,B引用A,但是这两个对象没有被其他任何对象引用,属于垃圾对象,却不能回收;每次引用都会附件一个加减法,影响性能。
- 标记清除法:分为两个阶段:标记阶段和清除阶段。标记阶段通过根节点标记所有可达对象,清除阶段清除所有不可达对象。缺点:因为清除不可达对象之后剩余的内存不连续,会产生大量内存碎片,不利于大对象的分配。
- 复制算法:将内存空间分成相同的两块,每次只是用其中的一块,垃圾回收时,将正在使用的内存中的存活对象复制到另外一块空间,然后清除正在使用的内存空间中的所有对象,这种回收算法适用于新生代垃圾回收。优点:垃圾回收对象比较多时需要复制的对象恨少,性能较好;不会存在内存碎片。缺点:将系统内存折半。
- 标记压缩算法:是一种老年代回收算法,在标记清除的基础上做了一些优化,首先从根节点开始标记所有不可达的对象,然后将所有可达的对象移动到内存的一端,最后清除所有不可达的对象。优点:不用将内存分为两块;不会产生内存碎片。
- 分代算法:新生代使用复制算法,老生带使用标记清除算法或者标记压缩算法。几乎所有的垃圾回收期都区分新生代和老生带。
- 分区算法:将整个堆空间分成很多个连续的不同的小空间,每个小空间独立使用,独立回收。为了更好的控制gc停顿时间,可以根据目标停顿时间合理地回收若干个小区间,而不是整个堆空间,从而减少gc停顿时间。
"Serial" is a stop-the-world, copying collector which uses a single GC thread. "ParNew" is a stop-the-world, copying collector which uses multiple GC threads. It differs from "Parallel Scavenge" in that it has enhancements that make it usable with CMS. For example, "ParNew" does the synchronization needed so that it can run during the concurrent phases of CMS. "Parallel Scavenge" is a stop-the-world, copying collector which uses multiple GC threads. "Serial Old" is a stop-the-world, mark-sweep-compact collector that uses a single GC thread. "CMS" is a mostly concurrent, low-pause collector. "Parallel Old" is a compacting collector that uses multiple GC threads. UseSerialGC is "Serial" + "Serial Old" UseParNewGC is "ParNew" + "Serial Old" UseConcMarkSweepGC is "ParNew" + "CMS" + "Serial Old". "CMS" is used most of the time to collect the tenured generation. "Serial Old" is used when a concurrent mode failure occurs. UseParallelGC is "Parallel Scavenge" + "Serial Old" UseParallelOldGC is "Parallel Scavenge" + "Parallel Old"
QA:
并发垃圾收集器(CMS)为什么没有采用标记整理-算法来实现,而是采用的标记-清除算法?
这是因为传统上大家认为年老代的对象可能会长时间存活且存活率高,或者是比较大,这样拷贝起来不划算
年轻代为何选用复制算法?
在分代式假设中,年轻代中的对象在minor GC时的存活率应该很低,这样用copying算法就是最合算的,因为其时间开销与活对象的大小成正比,如果没多少活对象,它就非常快;而且young gen本身应该比较小,就算需要2倍空间也只会浪费不太多的空间。
而年老代被GC时对象存活率可能会很高,而且假定可用剩余空间不太多,这样copying算法就不太合适,于是更可能选用另两种算法,特别是不用移动对象的mark-sweep算法。
相关推荐
- **增量收集(Incremental GC)**:为了减少长时间暂停(Stop-the-World)现象,将垃圾回收过程分成多个小步骤,每次只处理一部分内存,降低对应用的影响。 - **并发收集(Concurrent GC)**:如CMS(Concurrent ...
为了解决长时间暂停(Stop-the-World)问题,引入了增量收集。它将垃圾回收的过程分步进行,每次只处理一小部分对象,通过多次迭代完成整个垃圾回收。这样可以减少单次GC的暂停时间,但可能增加总体的垃圾回收时间。...
为了保证分析的准确性,垃圾回收过程需要暂停所有线程,即Stop-The-World(STW)。 3. 标记-清除算法: 这种算法分为标记和清除两个阶段。首先标记出所有可达的对象,然后清除未被标记的对象。虽然简单,但它会导致...
《垃圾回收算法详解》 在Java编程语言中,内存管理是一项关键任务,它涉及到程序运行时的内存分配和释放。由于程序员无需手动管理内存(即回收不再使用的对象),这一过程由Java虚拟机(JVM)的垃圾回收机制自动...
本章主要介绍了垃圾回收算法和JVM中实现的不同类型的垃圾回收器。 首先,垃圾回收的目的是识别并回收不再使用的对象,释放它们占用的内存资源。在Java中,主要采用可达性分析法来确定哪些对象是可回收的,即从根...
此算法虽简单,但存在两个主要问题:一是需要暂停整个应用(Stop-The-World),二是清除后会产生内存碎片,影响内存利用率。 复制算法解决了内存碎片问题。它将内存分为两等份,每次只使用其中一半。当垃圾回收时,...
《详解JVM的垃圾回收算法》 垃圾回收是Java虚拟机(JVM)管理内存的重要机制,它自动识别并清理不再使用的对象,以避免内存泄漏。本文将深入探讨JVM的垃圾回收算法及其细节,包括可达性分析、根节点枚举、安全点、...
有的会在垃圾收集开始时暂停所有应用程序线程(称为“stop-the-world”暂停),有的则允许应用程序继续运行,还有一些可以在多个线程上并行运行垃圾收集任务。这些差异影响了垃圾收集的效率和对应用程序性能的影响...
这被称为“stop-the-world”策略,虽然简单但会导致程序暂停,可能影响性能。 5. **内存碎片**:标记与清除策略可能会导致内存碎片,因为连续的内存空间可能被不连续的对象占用。为了优化内存使用,可以引入整理...
串行垃圾回收器采用单线程执行GC,因此在垃圾回收过程中,整个应用会被暂停,这种模式被称为"Stop-the-World"事件。串行回收器主要分为新生代和老年代两类: 1. 新生代串行回收器:它使用复制算法来清理内存。复制...
它在进行垃圾回收时会暂停所有其他工作线程,即"Stop the World"现象,以确保回收的准确性。Serial收集器使用复制算法进行新生代垃圾回收,标记-整理算法处理老年代。通过命令行参数`-XX:+UseSerialGC`可以启用。 2...
3. 垃圾回收算法: - 标记-清除(Mark-Sweep):首先标记出所有活动对象,然后清除未标记的对象。此算法会产生碎片,效率较低。 - 复制(Copying):将堆分为两部分,每次只使用一半,当一半满时,将存活对象复制...
本篇将深入探讨两种重要的垃圾回收器——G1收集器和ZGC,以及Stop the World现象和内存分配策略。 首先,G1(Garbage-First)收集器是一种并行并发的垃圾回收器,旨在减少垃圾回收停顿时间。其特点是采用了区域...
- **Stop-the-world**:这是指在执行GC的过程中,除了执行GC的线程外,所有其他线程都会暂停执行,直到GC任务完成。GC优化通常是指减少这种全局暂停的时间。 - **垃圾回收器面临的主要问题**: - **哪些对象需要...
3. **优缺点**:垃圾回收可以简化内存管理,防止内存泄漏,但可能会带来性能开销,如暂停程序执行(stop-the-world garbage collection)以及难以预测的内存释放时机。 在提供的文件列表中,`PtrManager.cpp`、`...
- **ParNew**:Serial的多线程版本,同样使用复制算法,但可能导致`StopTheWorld`事件。 - **Parallel Scavenge**:多线程新生代收集器,追求高吞吐量,允许调整参数以优化性能。 - **Serial Old**:单线程的老年代...
这个过程可能会导致程序暂停,被称为“Stop-the-world”事件,这是因为在此期间,所有非垃圾回收线程都需要暂停,直到垃圾回收完成。 在现代JVM实现中,例如Oracle的HotSpot JVM,通常会有不同的垃圾收集器,如串行...
长时间的垃圾回收暂停(也称为Stop-the-world事件)会导致用户界面冻结,影响用户体验。为此,V8和其他现代引擎引入了并发垃圾回收和增量垃圾回收,这些技术尝试将垃圾回收过程分解为更小的片段,以便在不影响主线程...