通过前面的介绍我们了解了对象创建和销毁的过程。那么JVM中垃圾收集器具体对对象回收采用的是什么算法呢?本文主要记录下JVM中垃圾收集的几种算法。

文章目录

  • JVM的垃圾回收的算法
    • 标记-清除算法(Mark-Sweep)
    • 复制算法(Copying)
    • 标记-整理算法(Mark-Compact)
    • 分代收集算法
      • 1.年轻代
      • 2.老年代
      • 3.永久代

JVM的垃圾回收的算法

标记-清除算法(Mark-Sweep)

  标记清除算法是最基础的回收算法,该算法分为两个阶段,即标记阶段和清除阶段。

阶段 说明
标记阶段 先根据可达性分析算法找出需要回收的对象进行标记
清除阶段 统一回收被标记的对象

参考《深入理解java虚拟机》:

从可达性分析算法角度看标记-清除算法

该算法不足有两点:

  1. 效率问题:标记和清理的效率都不高
  2. 空间问题:造成很多不连续的空间,如果要存储大对象,从而不得不提前触发GC回收操作

复制算法(Copying)

  复制算法是为了解决标记清除算法效率不高的问题而产生的,该算法的思路是。将内存空间一分为二(大小相等)。每次只使用其中一块来存储对象,当一块内存使用的差不多的时候就将这块中还存活的对象就复制到另一块内存中,然后清理掉已经使用过的那块内存。如下


这种算法的好处是每次直接对一半空间进行回收而且也不用考虑内存碎片的问题了,但是直接把空间砍掉一半。代价有点儿大。

标记-整理算法(Mark-Compact)

  标记-整理算法采用标记-清除算法一样的方式进行对象的标记,但在清除时不同,在回收不存活的对象占用的空间后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。标记-整理算法是在标记-清除算法的基础上,又进行了对象的移动,因此成本更高,但是却解决了内存碎片的问题

分代收集算法

  分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区之外还有一个代就是永久代(Permanet Generation)。老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。

1.年轻代

  回收算法以Copying为主,新创建的对象都存放在这里。因为大多数对象很快变得不可达,所以大多数对象在年轻代中创建,然后消失。当对象从这块内存区域消失时,我们说发生了一次“minor GC”

  1. 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
  2. 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。
  3. 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC(Major GC),也就是新生代、老年代都进行回收。
  4. 新生代发生的GC叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)。

2.老年代

  回收算法主要以Mark-Compact为主,没有变得不可达,存活下来的年轻代对象被复制到这里。这块内存区域一般大于年轻代。因为它更大的规模,GC发生的次数比在年轻代的少。对象从老年代消失时,我们说“major GC”(或“full GC”)发生了

  1. 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

  2. 内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

3.永久代

  用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的永久代空间来存放这些运行过程中新增的类。永久代也称方法区,
  注意:这块内存区域绝对不是永久的存放从老年代存活下来的对象的!!!在这块内存中有可能发生垃圾回收。发生在这里垃圾回收也被称为major GC

JVM中垃圾收集算法总结相关推荐

  1. JVM中垃圾收集算法

    1.标记-清除算法 最基础的垃圾收集算法,见名知意,该算法分为标记和清除两个阶段. ①首先标记所有需要回收的对象 ②标记后,统一回收所有被标记的对象 缺点: 效率问题:标记.清除两个过程效率都不高 空 ...

  2. JVM(三)--垃圾收集算法

    JVM(三)–垃圾收集算法 这篇博客的内容包括: 一.垃圾收集算法: 1,标记--清除算法: 2,复制算法: 3,标记--整理算法: 4,分代收集算法: 二.涉及到的问题: 1,标记清除,标记整理,复 ...

  3. JVM之垃圾收集算法

    在C++中垃圾回收是需要程序员显示地进行收集,在java语言中是由JVM进行负责垃圾收集的,以下介绍几种垃圾收集算法的思想. 标记-清除算法 标记-清除是最基础的算法,就如其名字一样,分为" ...

  4. JVM之垃圾收集算法和垃圾收集器详解

    这篇文章相比上一篇记录性的,多了不少我自己的理解,花费了很大的功夫整理,如果有时间和精力建议好好看一看深入理解JVM这本书. 也建议熟读背诵. JVM-垃圾收集器和内存分配策略 程序计数器.虚拟机栈. ...

  5. 深入理解JVM(二)--垃圾收集算法

    一. 概述 说起垃圾收集(Garbage Collection, GC), 大部分人都把这项技术当做Java语言的伴随生产物. 事实上, GC的历史远远比Java久远, 1960年 诞生于MIT的Li ...

  6. [读书笔记]JVM的垃圾收集算法

    1.标记-清除算法 (1)算法思想:第一步,标记好所有需要回收的对象:第二步,清除被标记的对象. (2)缺点:时间上,效率不高,无论是标记还是清除操作:空间上,会产生大量不连续的内存碎片,使得占用大内 ...

  7. JVM内存回收算法简述

    2019独角兽企业重金招聘Python工程师标准>>> 在第一代面向对象语言C++中,最让人头疼以及影响敏捷开发的无疑是内存的申请与回收 在程序运行时,使用享元设计使用的一些代码复用 ...

  8. 初探JVM之垃圾收集器

    前面大约了解了下JVM的垃圾收集算法,如果说收集算法是内存回收的方法,那么垃圾收集器就是内存回收的具体实现.现在HotSpot虚拟机都是用的G1收集器. 这里先总结下具体收集器的使用地方: 新生代:S ...

  9. JVM - 再聊GC垃圾收集算法及垃圾收集器

    文章目录 Pre 分代收集理论 常见的垃圾收集算法 标记-清除算法 标记-复制算法 标记-整理算法 垃圾收集器 Serial收集器 Parallel Scavenge收集器 [JDK8默认] ParN ...

最新文章

  1. 苹果新算法已混进 iOS 14.3!CSAM 检测技术再遭网友争议
  2. php ping 命令注入,CTF关于ping命令注入问题
  3. python dendrogram_【聚类分析】《数学建模算法与应用》第十章 多元分析 第一节 聚类分析 python实现...
  4. 【公开课预告】:超低延迟下的实时合唱体验升级
  5. Linux报文硬件时间戳,linux下修改时间戳
  6. 视频预训练界的HERO!微软提出视频-语言全表示预训练模型HERO,代码已开源!...
  7. 卢伟冰怼荣耀V30相机被喷 卢伟冰:从不打无准备之仗
  8. vue 实现文本的拖拽_Vue-实现简单拖拽(自定义属性)
  9. 【小记事】电脑命令行开WiFi
  10. 未能加载文件或程序集System.EnterpriseServices
  11. javascript服务器端验证_Blazor对打JavaScript:谁会成为前端应用程序的首选框架?...
  12. java商城系统设计-----积分商城系统
  13. 可以使用python开发财务软件吗_给还准备继续做审计的人提个醒!
  14. 懂的android基础如何面试月薪过万
  15. 程序员必备的8个编程工具
  16. Daily Scrum Meeting 11.03
  17. Git远程仓库配置SSH(以github为例)
  18. 安利3款可以将pdf转换成word免费软件
  19. Android音频格式转换,android音频文件转换格式
  20. 网上邻居不能访问问题集锦

热门文章

  1. python学习--多值参数
  2. Incomplete reply from server
  3. uint64_t是什么数据类型解析
  4. 西游记中孙悟空大闹天宫时玉帝为什么不亲自出手?
  5. [PTA] 7-2 I Love GPLT
  6. 从零开始前端学习[14]:选择器的优先级
  7. Excel中的小技巧amp;大智慧
  8. 信息安全管理 读书笔记
  9. SpringBoot模块创建依赖报错:
  10. mysql查询学生表的总人数,MySQL(表)-实操数据查询