文章目录

  • 总结
  • 一、标记-清除算法
  • 二、复制算法
  • 三、标记-整理算法

总结

常用的垃圾回收算法 :

  • 标记-清除算法 ;
  • 复制算法 ;
  • 标记-整理算法 ;

这些算法没有好坏优劣之分 , 都有各自的 优势 和 弊端 , 都有各自的 使用场景 ; 一般的垃圾回收 , 都是几种垃圾回收算法结合起来一起使用 , 不同的场景下 , 使用不同的垃圾回收算法 ;

分代收集算法 : 该垃圾回收算法不是特定的回收算法 , 而是 合理地使用上述 333 个算法 , 在 不同的内存空间内 , 使用不同的垃圾收集器 ;

这里的分代 指的是 年轻代 , 老年代 ; 年轻代又分为 Eden 和 Survivor 两个区域 , Survivor 又分为 From 和 To 两个区域 ;

一、标记-清除算法


堆 内的内存区域如下 , 内存区域分为一个个内存块 , 某个对象可能占用 222 个内存块 , 也能占用若干个内存块 ;

如果 定位 找到了 垃圾对象 , 那么 将该 垃圾对象 进行标记 , 如下图 , 标记为 橙色 ;

标记好之后 , 在执行 GC 内存回收时 , 会 将 被标记的 内存 回收 ;

标记-清除算法优缺点 :

  • 优点 : 算法 实现简单;
  • 缺点 : 产生了很多 不连续的内存 , 如果对象比较大 , 要用 555 个内存块 , 会出现 OOM ;

二、复制算法


将 内存区域 , 分为两部分 ;

对象只放在 左侧区域 , 右侧区域 空着 ;

左侧区域 的 垃圾对象 回收后 , 将 存活 的对象 , 拷贝到 右侧区域 中 ;

复制算法优缺点 :

  • 优点 : 解决了 内存碎片 问题 ; 效率高 ;
  • 缺点 : 只能使用 一半内存 ;

复制算法 适合使用 内存量较小 , 但是 操作很频繁的区域 , 如 : 在 年轻代 的 Survivor 中 , 使用的就是 复制算法 垃圾回收机制 ;

三、标记-整理算法


标记-整理算法 是 标记-清除算法 的更完善的版本 , 标记-整理算法 解决了 内存碎片问题 ;

内存回收后 , 将内存中的对象重新 紧密地 排列 , 消除内存碎片 ;

标记-整理算法 优缺点 :

  • 优点 : 消除了内存碎片 ;
  • 缺点 : 性能较低 ; 执行该垃圾回收算法时 , 需要 对内存进行重排 , 此时不能随意变动内存的数据结构 , 因此 执行该 标记-整理算法 时 , 整个线程需要整体停下来 , 但这样大大影响程序的执行效率 ;

标记-整理 算法 , 不能用在 内存操作 活跃的场景中 , 如 : 老年代的垃圾回收 , 使用的是 标记-整理 算法 ;

【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )相关推荐

  1. 学习笔记【Java 虚拟机②】垃圾回收

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  2. java虚拟机、垃圾回收、多线程

    虚拟机,我们都知道Java程序运行在虚拟机上,虚拟机又和操作系统打交道,最终通过二进制指令操纵电子电路运行.完成数据的读取,存储,运算和输出. 虚拟机在加载.class文件的时候,会在内存开辟一块区域 ...

  3. java虚拟机多久触发垃圾回收_每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  4. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  5. 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)

    java与C++之间有一道动态内存分配和垃圾收集的"墙",墙里面的人想出来,墙外边的人想进去,或许只有骑在墙上才能清楚的了解,墙内墙外都是牢笼. 上面一句出自<深入理解jav ...

  6. 浅析Java虚拟机的垃圾回收机制(GC)

    目录 一.垃圾回收机制(Garbage Collection) 二.对象回收的时机 引用计数法 可达性分析算法 三.垃圾回收算法 标记-清除算法 标记-复制算法 标记-整理算法 新生代.老年代.永久代 ...

  7. GC算法 (标记清除、复制、标记整理、 分代收集) 、 新生代 老年代

    一.标记-清除算法(Mark-Sweep)   1标记阶段:首先通过根节点,标记所有从根节点开始的可达对象.未被标记的对象就是未被引用的垃圾对象 2清除阶段:清除所有未被标记的对象. 不足:1效率问题 ...

  8. 了解java虚拟机mdash;垃圾回收算法(5)

    引用计数器法(Reference Counting) 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器减1.只要对象A的引用计数器的 ...

  9. Java虚拟机:垃圾回收机制与垃圾收集器

    一.垃圾回收机制: 1.垃圾回收的过程: JVM内存区域的程序计算器,虚拟机栈.本地方法栈的生命周期是和线程同步的,随着线程的销毁而自动释放内存,所以只有堆和方法区需要GC,方法区主要是针对常量池的回 ...

  10. ReviewForJob——java虚拟机的垃圾回收策略(个人总结)

    理解jvm的垃圾回收策略,需要解决以下3个问题 问题1:哪些内存需要回收? 问题2:什么时候进行回收? 问题3:怎样来回收? [解决问题1]哪些内存需要回收? jvm的内存区域有5大块: 1)程序计数 ...

最新文章

  1. SUBSTRING函數用法
  2. 【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (上篇)
  3. 线上比赛中关于视觉AI组与信标组补充说明
  4. AOP配置开发入门案例
  5. python语言介绍-00-python语言介绍
  6. Dynpro F4的实现测试
  7. catch(...)详解
  8. Android端打开HttpDns的正确姿势
  9. RabbitMQ中常用的三种Exchange 类型
  10. div为空的时候 浮动没有效果_3种CSS清除浮动的方法
  11. 49.把字符串转换成整数
  12. Tomcat启动时报org.springframework.web.context.ContextLoaderListener错误解决方案
  13. sql server 2000数据库 最近经常出现某进程一直占用资源,阻塞?死锁?
  14. paip.提升用户体验---导入导出
  15. django 序列化组件Serializer
  16. 防火墙和代理服务器之间有什么区别
  17. 基于python3.5+opencv+windowsAPI图像识别实现的连连看外挂
  18. 天翼云监控客户pc端及手机端下载安装教程
  19. latex解决存在/任意/非符号如何打
  20. 关于代码选择省份和城市?

热门文章

  1. 在JAVA中使用MongoDB
  2. DEDE常见问题(转)
  3. hibernate 初学 第一个例子
  4. 使用String.format简化代码
  5. 软件工程学习笔记——软件工程基本原理
  6. 分享几篇VMP研究和分析的文章
  7. 法向量影响光源照射物体后,物体产生的视觉感光效果
  8. UESTC 电子科大专题训练 数据结构 J
  9. 解决 The word is not correctly spelled问题
  10. Vivado HLS error: Cannot find ISE in the PATH variable or it's an unsupported version