几种基本的垃圾收集算法
标记-清除算法
顾名思义,此方法涉及到两个步骤:标记和清除。首先标记出所有需要回收的对象,在标记完成后统一完成回收。标记的过程在《Java垃圾收集之对象引用》中已经介绍过。此方法是最基础的垃圾收集算法,后续的收集算法均基于此方法改进而得来。
它的缺点主要有两个,一个是效率问题,标记和清理的过程执行效率都不高;第二是清理过后容易产生很多不连续的内存空间,即内存碎片。太多的内存碎片,会导致在分配占用大量内存空间的对象时候没有足够的连续内存而不得不提前触发另一次垃圾收集动作。
复制算法
为了解决上述算法的效率问题,复制算法出现了。它将可用的内存空间分为大小相同的两块,每次只使用其中的一块内存区域,当这快内存区域使用完时,就将存活的对象复制到另一块内存空间中,然后再把使用过的内存空间一次清理干净。
这样,每次都是对其中的一块区域进行回收,内存分配时也不用考虑内存碎片问题,只要顺序移动堆顶指针,按序分配内存即可,简单高效。
缺点也很明显,可用内存缩小为原来的一半。
现代的商业虚拟机都采用此法来回收新生代,由于新生代中的对象一般情况下98%都是朝生夕死的,所以并不需要按照1:1的比例划分空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间。每次使用Eden和其中的一块Survivor空间。HotSpot虚拟机按照8:1的空间分配Eden与Survivor空间,也就是说,只有10%的空间是被浪费的。
当Survivor空间不足时(并不一定每次存活的内存都在10%以内),需要向其他内存空间今夕功能分配担保(Handle Promotion)。
标记-整理算法
复制算法只能在对象存活率较低的情况下有良好的性能表现,但在对象存活率较高的情况下就不适用了,原因是要进行大量的对象复制操作。更关键的是,如果对象存活率高,那么就不得不浪费50%的内存空间来应对对象100%存活的极端情况。所以,在老年代中,一般不采用此方法进行垃圾回收。
所以,在老年代中,采用的垃圾收集算法是“标记-整理”算法。标记过程和“标记-清除”算法中的标记过程相同,但后续的步骤是将存活的对象向内存的同一端移动,然后直接清理掉剩余的部分。
分代收集算法
当前商业虚拟机的垃圾收集器都采用“分代收集(Generational Collection)”算法,根据对象存活周期的不同而将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点来采用不同的垃圾收集策略。新生代由于对象存活率低,采用复制算法,只要付出复制少量存活对象的代价就可以完成垃圾收集。而老年代由于对象存活率高,标记整理或者标记清除算法就更加适合。
相关推荐
深入理解JVM垃圾收集算法与垃圾收集器
基于实时性的Java虚拟机垃圾收集算法.
经典的Java虚拟机(垃圾收集器和算法)文档,需要深入了解Java虚拟机的原理的人员可以观看,可以升入了解Java虚拟机(垃圾收集器和算法)
主要整理内容为:分析了垃圾收集的算法和JDK1.7中提供的7款垃圾收集器的特点以及运作原理。以及内存分配策略
基于实时性的Java虚拟机垃圾收集算法.pdf
Java虚拟机垃圾收集算法的研究和改进.pdf
提出了一种适用于实时性环境的Java虚拟机垃圾收集算法。该算法对增量式收集器中堆空间的划分方式、引用跟踪等方面进行了改进,以减少垃圾收集带来的不确定性暂停,并可以使用户指定一个时间段内垃圾收集导致应用程序...
基于嵌入式Java虚拟机的垃圾收集优化算法应用.pdf
今天小编就为大家分享一篇关于Java垃圾回收之分代收集算法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
知识点覆盖范围:垃圾回收算法、垃圾收集器、GC原理、垃圾回收的优缺点等。 难度级别:从基础到高级,面试官可能会深入探讨垃圾回收的细节和实现原理。 实践经验:理论知识之外,面试官可能会问到实际场景下的优化...
第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...
关于Java垃圾回收机制 垃圾收集的算法分析 垃圾回收的几个特点
知道有什么垃圾收集器么,知道有哪些垃圾收集算法么? 我:心中一阵窃喜。这不是我前两天晚上打游戏。呸这不是前两天晚上我在《JAVA虚拟机》这本书第三章看过的内容么。其实这个面试问题非常常见了,基本各个公司...
GC垃圾收集器+GC垃圾收集算法,配合java虚拟机一起看,效果更佳,内容简洁,重要,应届小白面试必备技能
由Java语言与C/C++对象在内存管理方式的不同,引出了Java语言的优势技术——垃圾...通过对GC工作原理的阐述及对一些传统的垃圾收集器的分析,提出了一种新的垃圾处理算法,一定程度上改善和提高了Java垃圾处理的性能。
上一篇介绍了Java虚拟机的运行时内存区域,接下来将来学习下几种常见的垃圾收集算法,进入正题。 概述 在早期,人们就在思考GC(Garbage Collection,GC)需要完成的三件事: 哪些内存需要回收? 什么时候回收? ...
《深入Java虚拟机》中,垃圾回收的火车算法。 文档把算法的步骤总结了一下,希望可以对大家有些用处
讲解java虚拟机 包括内存模型,内存管理,垃圾回收算法,垃圾回收调优,arthas、jmap内存问题排查
学习JVM垃圾回收我们应该知道" Stop The World",STW会伴随任何一种GC算法中发生,STW意味着JVM因为要执行GC而停止了应用程序的执行,当 当Stop-the-world发生时除了GC所需的线程以外,所有线程都处于等待状态,直到...