jvm垃圾收集算法

这篇具有很好参考价值的文章主要介绍了jvm垃圾收集算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

由于《分代收集理论》和不同垃圾收集算法,Java堆应该被划分为不同区域,一般至少会把Java堆划分为新生代(Young Generation)老年代(Old Generation)两个区域

垃圾收集器可以只回收其中某一个或者某些部分的区域对应不同的垃圾回收:

“Minor GC”:新生代的垃圾收集

“Major GC”:老年代垃圾收集

“Full GC”:整个Java堆和方法区的垃圾收集

默认的,新生代( Young ) 与老年代( Old ) 的比例的值为 1:2即:新生代( Young ) = 1/3 的堆空间大小。 老年代( Old ) = 2/3 的堆空间大小 ( 该值可以通过参数–XX:NewRatio 来指定)

新生代又划分为一块Eden和两块Survivor(占比新生代的80%、10%、10%)

jvm垃圾收集算法,# jvm,jvm,算法

标记-清除算法

算法分为“标记”和“清除”两个阶段:

“标记”:标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象(标记过程就是对象是否属于垃圾的判定过程

“清除”:回收标记对象

两大缺点

1、执行效率不稳定

如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低。

2、内存空间的碎片化

标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

标记-复制算法

标记-复制算法常被简称为复制算法,为了解决标记-清除算法面对大量可回收对象时执行效率低的问题。

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

存在问题

如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制的开销

但对于多数对象都是可回收的情况,算法需要复制的就是占少数的存活对象,而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑有空间碎片的复杂情况,只要移动堆顶指针,按顺序分配即可。(实现简单、运行高效)

是将可用内存缩小为了原来的一半,会造成空间浪费

实际上

新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor
【HotSpot虚拟机默认Eden和Survivor的大小比例是8∶1(-XX:SurvivorRatio=8参数可以修改默认比例),即每次新生代中可用内存空间为整个新生代容量的90%(Eden的80%加上一个Survivor的10%)】

发生垃圾回收时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。

新生代中垃圾回收时,如果有多于10%对象存活,此时一个Survivor空间不足以容纳一次Minor GC之后存活的对象,就需要依赖其他内存区域(实际上大多就是老年代)

标记-整理算法

标记-复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低。如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法

“标记-整理”(Mark-Compact)算法:

“标记”:标记出所有需要回收的对象

“整理”:让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存

标记-清除算法与标记-整理算法的本质差异在于前者是一种非移动式的回收算法,而后者是移动式的。

存在问题

移动存活对象,尤其是在老年代这种每次回收都有大量对象存活区域移动存活对象并更新所有引用这些对象的地方是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用程序才能进行,像这样的停顿被最初的虚拟机设计者形象地描述为“Stop The World”。

垃圾收集的停顿时间来看,不移动对象停顿时间会更短,甚至可以不需要停顿,但是从整个程序的吞吐量来看,移动对象会更划算。

不移动对象会使得收集器的效率提升一些,但因内存分配和访问相比垃圾收集频率要高得多,这部分的耗时增加,总吞吐量仍然是下降的。

“和稀泥式”解决方案

虚拟机平时多数时间都采用标记-清除算法,暂时容忍内存碎片的存在,直到内存空间的碎片化程度已经大到影响对象分配时,再采用标记-整理算法收集一次,以获得规整的内存空间

CMS收集器面临空间碎片过多时采用的就是这种处理办法。文章来源地址https://www.toymoban.com/news/detail-730480.html

到了这里,关于jvm垃圾收集算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java虚拟机(JVM):垃圾收集算法

    目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法  四、标记-整理算法 分代收集理论建立在两个分代假说之上: 1、弱分代假说:绝大多数对象都是朝生夕灭的。 2、强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。 这两个分代假说共同奠定了多款垃

    2024年02月12日
    浏览(50)
  • JVM——分代收集理论和垃圾回收算法

    弱分代假说 :绝大多数对象都是朝生夕灭的。 强分代假说 :熬过越多次垃圾收集过程的对象越难以消亡。         这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则: 收集器应该将Java堆划分出不同的区域 ,然后将 回收对象依据其年龄 (年龄即对象熬

    2024年02月12日
    浏览(44)
  • 小研究 - 浅析 JVM 中 GC 回收算法与垃圾收集器

    本文主要介绍了JVM虚拟机中非常重要的两个部分,GC 回收算法和垃圾收集器。从可回收对象的标记开始,详细介绍 了四个主流的GC算法,详细总结了各自的算法思路及优缺点, 提出了何种情况下应该通常选用哪种算法。 目录 1 标记可回收对象 1.1 引用计数器 1.2 可达性分析

    2024年02月14日
    浏览(38)
  • 【JVM】JVM垃圾收集器

    垃圾收集器是负责 执行垃圾回收的组件 ,它们用于 管理Java程序运行时的内存分配和释放 。垃圾收集器的主要任务是 自动回收不再使用的内存对象 ,并将 内存空间重新回收 以供程序继续使用。 Serial和Serial Old串行垃圾收集器,是指 使用单线程进行垃圾回收 ,堆内存较小,

    2024年02月13日
    浏览(42)
  • JVM垃圾回收——G1垃圾收集器

    目录 一、什么是G1垃圾收集器 二、G1垃圾收集器的内存划分 三、G1垃圾收集器的收集过程  四、G1收集器的优缺点 五、G1收集器的JVM参数配置         Garbage First(简称G1)收集器是垃圾收集器技术发展史上里程碑式的成果,它摒弃了传统垃圾收集器的严格的内存划分,而是采

    2024年02月05日
    浏览(45)
  • JVM 垃圾收集器

    重点:CMS,G1,ZGC 主要垃圾收集器如下,图中标出了它们的工作区域、垃圾收集算法,以及配合关系。 Serial 收集器 Serial 收集器是最基础、历史最悠久的收集器。 如同它的名字(串行),它是一个单线程工作的收集器,使用一个处理器或一条收集线程去完成垃圾收集工作。

    2024年02月10日
    浏览(47)
  • JVM 垃圾收集

    分代理论 弱分代假说:绝大多数对象都是朝生夕灭,即绝大多数对象都是用完很快需要销毁的。 强分代假说:熬过多次垃圾收集过程的对象就越难以消亡,即如果对象经过多次垃圾收集后仍存活,那么这些对象一般是长久存在难以消亡的,即进入永久代。 跨代引用假说:跨

    2024年02月11日
    浏览(37)
  • 08-JVM垃圾收集器详解

    上一篇:07-垃圾收集算法详解 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。 虽然我们对各个收集器进行比较,但并非为了挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,我们能做

    2024年02月09日
    浏览(48)
  • JVM ZGC垃圾收集器

    ZGC(“Z”并非什么专业名词的缩写,这款收集器的名字就叫作Z Garbage Collector)是一款在JDK 11中新加入的具有实验性质[1]的低延迟垃圾收集器,是由Oracle公司研发的。 ZGC收集器 是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术

    2024年02月10日
    浏览(48)
  • JVM的故事——垃圾收集器

    新生代收集器,最基础的收集器,单线程。进行垃圾收集时必须暂停其他所有工作线程,stop the world 新生代收集器,实质上是serial收集器的多线程版本。除了serial,只有它能和CMS收集器(老年代收集器)配合工作。随着处理器核心数越来越多,parnew比serial有着更好的性能。(但如

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包