上回介绍了"平平无奇"的标记清除算法却是JAVA GC的灵魂, 介绍的过程中留下了几个问题, 其中一个问题是: 标记清除算法正在运行时各个对象的依赖关系发生了变化怎么办?

我们先假设GC拥有独立的线程, 与用户的逻辑并行的运行, 看看会有哪些不符合预期的情况.

情况一: 该回收的没回收

在标记的过程中, 在对象被标记之后, 用户的线程做了一些操作, 所有对象都不再依赖这个对象了, 那么这个对象应该被回收, 但是在这次遍历中不会被回收了

情况二: 不该回收的回收了

在标记的过程中, 用户的线程又创建一些新对象, 并且与旧的对象存在一些依赖关系, 但是依赖这些对象的旧对象在这次标记中都已经被遍历过了, 也就是说这些新产生的对象在这次的遍历过程中不会被标记了, 那么它们应该会被标记为可回收的对象, 然后就被回收掉了.对于情况一: 该回收的没回收还是能忍的, 因为下次遍历时就能进行回收了

对于情况二: 不该回收的回收了是没有办法忍的, 因为明明用户逻辑还需要的对象就直接被回收了, 会导致出错.

先分析一下这两种情况产生的原因——都是由于GC线程与用户逻辑并行运行导致的. 那么应该怎么解决这个问题呢?

聪(糊)明(弄)伶(老)俐(板)的开发者想到了一个简单粗暴的解法: 让GC线程和用户逻辑的线程不要同时运行, 先运行用户逻辑的线程, 运行到需要GC的时候, 就把所有用户逻辑的线程给停住, 然后启动GC线程去进行标记清除, 在GC线程标记清除运行结束后, 再继续进行用户逻辑的线程. 这种方法就是大名鼎鼎的STW (Stop-The-World, 意思是在GC的时候停下用户逻辑的全世界).

STW本质是通过把GC和用户逻辑搞成串行的方法, 来避免上面的两种并发可能会导致的问题. 但是它引入了一个很大的代价, 就是会停止用户逻辑的运行一段时间, 举个例子, 用户逻辑是一个JAVA的网站的服务, 那么一旦它开始进行GC后就不再接受用户的请求了, 这个网站在这段时间内就是不可用(不响应任何请求)的状态. 也正是因为这个STW的特点, 让追求极致可用性的开发者都转入了C/C++阵营.

在结束这篇文章之前, 再问个问题: GC是不是一定要STW?

虽然即使目前最优秀的垃圾回收器的实现还是需要STW的(尽管已经优化到了非常短暂的时间), 但是我依然相信未来的某一天, 会出现完全不需要STW的垃圾回收器. 因为随着屏障技术越来越细致, 我相信最终会迎来某个时间, GC的线程是完全和用户线程并行运行的, 当然这需要用户的逻辑满足一些特定的条件才能达到, 关于这块的讨论, 后续再继续填坑.

下篇介绍: 聊聊JAVA GC系列(7) - 标记整理算法

java stw_聊聊JAVA GC系列(6) - STW相关推荐

  1. gc java root_聊聊Java的GC机制

    原标题:聊聊Java的GC机制 近日,MIUI在小米全球社区发布公告,表示MIUI将在全球市场销售的手机中预装谷歌拨号及谷歌消息应用程序(中国.印度.印度尼西亚等市场除外).小米表示,小米9T Pro ...

  2. java bytebuffer_聊聊JAVA的ByteBuffer

    NIO简介 JAVA NIO是在JDK1.4中引入的,因此它是一个很古老的特性了.与NIO相对应的我们称之为BIO(阻塞IO).NIO相比于BIO的区别有很多,比如BIO是面向流的,而NIO是面向块的 ...

  3. java整段标记_聊聊JAVA GC系列(7) - 标记整理算法

    在介绍"平平无奇"的标记清除算法时, 还留下了另一个问题, 就是内存碎片的问题. 内存碎片的问题是指, 每次回收的内存都是比较分散的, 可以加起来是一个比较大的数值, 但是由于可用 ...

  4. java 程序执行后 强制gc_【GC系列】JVM的常用GC参数及GC日志解析

    今天继续GC系列第三篇,熬夜不易,欢迎一键三连,给个鼓励,不点赞也没关系,我还可以,谢谢捧场[捂脸]. 常见垃圾回收器组合设定 在oracle官网上可以看到如何开启使用指定垃圾回收的命令: https ...

  5. Java GC系列(4):垃圾回收监视和分析

    转载自  Java GC系列(4):垃圾回收监视和分析 在这个Java GC系列教程中,让我们学习用于垃圾回收监视和分析的工具.然后,选用一种工具来监视一个Java示例程序的垃圾回收过程.如果你是一名 ...

  6. Java GC系列(2):Java垃圾回收是如何工作的

    转载自   Java GC系列(2):Java垃圾回收是如何工作的 本教程是为了理解基本的Java垃圾回收以及它是如何工作的.这是垃圾回收教程系列的第二部分.希望你已经读过了第一部分:<Java ...

  7. Java GC系列(1):Java垃圾回收简介

    转载自  Java GC系列(1):Java垃圾回收简介 这篇教程是系列第一部分.首先会解释基本的术语,比如JDK.JVM.JRE和HotSpotVM.接着会介绍JVM结构和Java 堆内存结构.理解 ...

  8. Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  9. java gc机制 优点_聊聊Java的GC机制

    作者 某人Valar 如需转载请保留原文链接 部分图片来自百度,如有侵权请联系删除 本文目录 什么是GC JVM内存结构简单介绍 可达性分析与GC Roots 常见的垃圾收集算法 1. 什么是GC G ...

最新文章

  1. QT Creator介绍
  2. 区块链BaaS云服务(35)亦笔科技ODRChain
  3. SpringBoot-切面AOP实现统一逻辑处理
  4. [云炬创业学笔记]第一章创业是什么测试16
  5. 单列集合Set的实现类TreeSet
  6. 【2018ACM山东省赛 - C】Cities(最小生成树变形优化,贪心思维)
  7. 华为人均工资高达70万,但先看看华为员工的16 项标准
  8. android 中 gravity 和 layout_gravity 的区别
  9. 微软符号服务器 2020年_微软介绍了2020年后它将如何淘汰Edge中的Flash支持
  10. SpringBoot与JPA
  11. linux pdf to txt,PDF转换为TXT
  12. 前端开发核心JavaScript要怎么学?给转行或是自学的朋友提些学习建议
  13. 去找工作还要先交押金我认为不太靠谱
  14. 普元 EOS Platform 7.6 Studio导出流程par包,在workspace中导入报错:租户令牌不正确,部署失败
  15. 适合初学者 :用Google map street view api 实现批量下载谷歌地图街景 in python
  16. SAP QM 特性导出及定性定量
  17. C++ primer Plus(第六版)中文版第九章第3题
  18. 制作一个简单HTML抗疫逆行者网页作业(HTML+CSS)
  19. ScriptManager脚本管理器
  20. web项目开发---部署

热门文章

  1. 从菜鸟到架构师(二)
  2. 投资理财-关于消费贷
  3. 给南开大学礼鹤同学的回信----关于开源的思考
  4. ASP.NET 生成二维码(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
  5. 天津室内3DMAX培训自学还是报班?哪家好?
  6. 玩家经常反映玩游戏卡要怎么处理
  7. 寿司之神,走下神坛,被米其林“摘星”是因为普通食客吃不到!
  8. mac os High Sierra 升级错误
  9. 《How to Train Good Word Embeddings for Biomedical NLP》
  10. HTML之textarea 换行和空格问题