标记清除算法

当堆中的有效空间被耗尽时,JVM就会停止整个程序(也被称为stop the world),然后开始两项工作.一是:标记, 而是:清除

标记

遍历所有GC Roots,将所有GC Roots可达的对象都标记为存活对象.

清除

遍历堆中所有的对象把没有标记的对象全部清除.

在程序运行期间,当堆中的可用内存被耗尽时,GC线程就会启动并停止程序,GC线程将存活的对象标记一遍,没有被标记的对象就是垃圾对象,最后这些垃圾对象会被清除掉,然后重新唤醒应用程序.

程序运行时堆中对象的状态(默认为0未标记,1为标记过),假如堆内存的可用空间被消耗完,那么GC线程就会启动,停止掉应用程序,使用根可达性算法进行搜索标记.

被标记后的对象状态

使用根可达性算法,所有GC Roots可达的对象都被标记为存活对象,此时已经完成了第一阶段的工作.接下来执行清除操作,执行完清除操作,堆中对象的状态.

没有标记的对象被清除,被标记的对象会被留下,标志为被置为0,应用程序被唤醒.

标记清除的优点是算法简单,缺点如下:

1.效率低下,需要遍历整个堆.进行GC的时候需要停止应用程序
2.垃圾回收后的内存空间是不连续的,因为垃圾对象的分布很随意,那么清除后的内存会不连续. 为了解决这个问题,JVM不得不维护一个空闲链表,又会导致额外的开销.

复制算法

复制算法使用了两块同等大小的内存空间,每次只用一块,垃圾回收的时候,把存活的对象直接另外一块内存,然后剩余的垃圾对象全部一次性清除.好处是复制存活对象的时候就不用考虑内存碎片.唯一的缺点就是内存利用率只有50%.

现在的虚拟机一般都用复制算法回收新生代,IBM的研究发现,新生代中的对象98%都是朝生夕死,所以并不需要1:1分配对象,而是将内存分为一个大的Eden和两块小的Survivor空间,每次只使用Eden和一块Survivor. 当进行垃圾回收时,将存活对象一次性复制到一块Survivor空间,最后清除掉Eden和使用过的Survivor空间. HotSpot虚拟机Eden:Survivor=8:1,也就新生代可用的内存达到90%,只会有10%的浪费.当然98%的对象可被回收只是一般的场景,并没有办法保证每次Survivor都能存放的下存活对象,若Survivor空间不够时,需要依靠老年代进行分配担保.

from ,to为Survivor区。

JVM垃圾回收算法标记清除和复制算法相关推荐

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

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

  2. JVM垃圾回收算法 总结及汇总

    先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回 ...

  3. JVM - 垃圾回收相关算法

    目录 总览 垃圾标记阶段:对象存活判断 引用计数算法 可达性分析算法(根搜索算法.追踪性垃圾收集) 对象的 finalization 机制 MAT 与 JProfiler 查看 GC Roots 垃圾 ...

  4. 看完这篇 JVM 垃圾回收,和面试官扯皮没问题了

    本文来源:码海 前言 Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员专注于程序本身,不 ...

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

    文章目录 总结 一.标记-清除算法 二.复制算法 三.标记-整理算法 总结 常用的垃圾回收算法 : 标记-清除算法 ; 复制算法 ; 标记-整理算法 ; 这些算法没有好坏优劣之分 , 都有各自的 优势 ...

  6. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

    文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...

  7. 2、垃圾回收算法(标记清除算法、复制算法、标记整理算法和分代收集算法),各种垃圾收集器讲解(学习笔记)

    2.垃圾回收概述 2.1.垃圾回收算法 2.1.1.垃圾回收算法-标记清除算法 2.1.2.垃圾回收算法–复制算法 2.1.3.垃圾回收算法–标记整理算法和分代收集算法 2.1.4.垃圾回收算法–Se ...

  8. 垃圾回收器机制(二):快速解读GC算法之标记-清除,复制及标记整理-算法

    标记/清除算法 它的做法是当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被成为stop the world),然后进行两项工作,第一项则是标记,第二项则是清 ...

  9. jvm垃圾回收策略之标记清除

    垃圾回收指的是对 jvm堆内存的回收. 一. java虚拟机栈 二.本地方法栈(Native Method Stack) 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出Stac ...

最新文章

  1. Class.forName(xxx.xx.xx) 解耦
  2. Maven学习笔记(二)
  3. html怎么循环输出_for 循环疑难点
  4. [vue-cli] vue-cli中你经常的加载器有哪些?
  5. TortoiseSVN 1.9.5安装 与 Eclipse4.4.2中安装SVN插件 图解详解
  6. 使用mkdir创建同级多目录
  7. java produces_java-在所有产生JSON的端点上使用@Produces(“...
  8. ELK 6下日志平台监控Nginx日志构建实践
  9. HDU-1069 Monkey and Banana 动态规划
  10. qt电容触摸屏实现长按_电阻屏和电容屏有什么区别?究竟谁更胜一筹?
  11. CentOS6 x86_64最小化安装优化脚本
  12. vue 实现点击选中div后, 右下角显示对号√
  13. 软件测试工程师的自我认识和定位!!
  14. 班级网站java,ssm班级网站
  15. java毕业设计软件源代码SSM酒店管理系统|旅店管理
  16. 第五天实验---MGRE环境下的OSPF实验
  17. 每日词根——flor(花)
  18. 视频教程-视频打包为MP4格式并存储到TF卡的实现-第7/11季-嵌入式
  19. 【流媒体性能测试常用指标】
  20. 太高效了,全靠这款可视化报表工具,实用

热门文章

  1. Cisco ASA ‘LU allocate xlate failed’排错一例
  2. 红旗7.0 rc1 版编辑开始菜单
  3. python switch语句的多种实现方法
  4. 基于Linux的USB主/从设备之间的三种通信方式-转
  5. 蓝桥杯 ALGO-74 算法训练 连接字符串
  6. vim nerdtree 标签_学业支持 | OS课程——给你的vim换套新衣服
  7. Perl调用shell命令方法小结
  8. 关于 JavaScript 浮点运算的精度解决方案
  9. usermod命令,用户密码管理,makpasswd
  10. tomcat 运行报错 JRE_HOME