什么是 Java 中的 Logging Write Barrier?

Logging Write Barrier 是 Java 垃圾回收器在维护堆引用关系时常用的一种机制。它是一种特殊的写屏障(Write Barrier),用于记录堆中某些引用的变化情况。该机制的主要目的是协助垃圾回收器在并发或增量标记阶段,正确跟踪对象引用的变化。


1. 什么是写屏障?

写屏障是垃圾收集器在应用程序线程(Mutator)执行写操作(对象字段赋值、数组元素更新等)时插入的一段额外代码,用来捕捉或记录引用的变化。写屏障的具体实现和目的因垃圾回收器的策略不同而有所不同。

常见的写屏障类型:

  1. Card Table Write Barrier:更新脏卡,标记哪些内存区域需要重新扫描。
  2. Logging Write Barrier:记录对象引用的变更(如 SATB 使用的缓冲区)。
  3. Remembered Set Write Barrier:维护跨代引用或跨分区引用的集合。

2. Logging Write Barrier 的原理

Logging Write Barrier 的核心功能是将引用的更新操作记录到一个缓冲区中,供垃圾回收器在并发或增量阶段处理。这一机制广泛用于垃圾回收器的并发标记阶段,比如 G1 和 Shenandoah GC。

工作流程:

  1. 对象引用更新

    • 当一个对象字段或数组元素的引用被更新时,触发 Logging Write Barrier。
  2. 记录变更

    • 写屏障将更新前的旧引用(旧值)记录到一个专用缓冲区中(例如 SATB 的缓冲区)。
  3. 回收阶段处理

    • 在垃圾回收的标记阶段,回收器会使用缓冲区中的信息来补偿并发期间遗漏的引用变更,确保标记过程的正确性。

3. Logging Write Barrier 的应用

3.1 G1 垃圾收集器中的应用

G1 使用 SATB(Snapshot-At-The-Beginning)算法来维护对象图的快照状态。Logging Write Barrier 是 SATB 的关键实现手段:

  • 当 Mutator 删除某个对象的引用时,旧引用通过写屏障被记录到缓冲区中。
  • 在并发标记阶段,回收器通过处理缓冲区中的旧引用,确保对象快照状态的一致性。

3.2 Shenandoah 垃圾收集器中的应用

Shenandoah 使用类似机制跟踪引用的变化,确保并发标记阶段的引用关系完整。


4. Logging Write Barrier 的优缺点

优点:

  1. 准确性高:能够捕捉 Mutator 对堆内引用的所有变更,避免遗漏对象引用。
  2. 支持并发标记:使得回收器在标记阶段能够与 Mutator 并发运行,提高性能。
  3. 实现简单:相比其他复杂机制,Logging Write Barrier 的实现相对直观。

缺点:

  1. 额外的开销:每次引用更新都会触发屏障逻辑,对程序性能有一定影响。
  2. 缓冲区管理成本:需要额外的内存来存储记录,并定期处理这些缓冲数据。

5. 总结

Logging Write Barrier 是一种记录堆内对象引用更新的机制,主要用于支持并发垃圾回收器的标记阶段。例如:

  • G1 使用 Logging Write Barrier 配合 SATB,记录引用删除操作,维持标记阶段的快照一致性。
  • Shenandoah 等其他回收器也采用类似机制以提高并发效率。

通过 Logging Write Barrier,可以在降低 STW 停顿时间的同时,保证垃圾回收器的标记过程准确可靠。

什么是 Java 中的 logging write barrier?的更多相关文章

  1. Java中的日志——Java.util.logging、log4j、commons-logging

    Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging.其中log4j和commons-loggin ...

  2. Java Se: Logging 框架说明

    Java Logging 用惯了log4j等日志工具,竟然不知Java还自带了个log工具.今天有空了就来了解一下. 先来看一个简单的例子: public class SystemTest { pri ...

  3. java中多线程中Runnable接口和Thread类介绍

    java中的线程时通过调用操作系统底层的线程来实现线程的功能的. 先看如下代码,并写出输出结果. // 请问输出结果是什么? public static void main(String[] args ...

  4. java中动态反射

    java中动态反射能达到的效果和python的语法糖很像,能够截获方法的实现,在真实方法调用之前和之后进行修改,甚至能够用自己的实现进行特别的替代,也可以用其实现面向切片的部分功能.动态代理可以方便实 ...

  5. 你真的了解JAVA中与Webservice相关的规范和实现吗?

    非常多人在项目中使用Webservice,仅仅是知道怎样公布Webservice,怎样调用Webservice,但真要论其来龙去脉,还真不一定清楚. 一切一切还要从我们伟大的sun公司规范说起. JA ...

  6. slf4j+log4j在Java中实现日志记录

    小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...

  7. JAVA中使用log4j及slf4j进行日志输出的方法详解

    JAVA中输出日志比较常用的是log4j,这里讲下log4j的配置和使用方法,以及slf4j的使用方法.  一.下载log4j的架包,并导入项目中,如下: 二.创建log4j.properties配置 ...

  8. Java 中Log4j的使用详情

    Log4j 真的很简单,简单到令人发指的地步.不是要记录日志吗?那就给你一个Log ,然后你用Log 来写东西就行了,先来一个完整类示例: package test; import org.apach ...

  9. 第77节:Java中的事务和数据库连接池和DBUtiles

    第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...

  10. java中如何模拟真正的同时并发请求?

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

随机推荐

  1. ADALM-Pluto修改IP地址

    在 GNURadio 中使用 ADALM-Pluto(以下简称Pluto)模块是以 IP 地址为基础进行通信的,而固定的 IP 地址 192.168.2.1 导致一台电脑无法使用多个 Pluto,因此 ...

  2. 最佳产品奖,TeleDB拿下!

    近日,第十三届PostgreSQL技术大会在杭州举行.本次大会以"聚焦云端创新,汇聚智慧共享"为主题,行业大咖.学术精英.技术专家和技术爱好者齐聚一堂,共同探讨数据库领域的发展趋势 ...

  3. FreeSql学习笔记——12.执行Sql

    前言   FreeSql支持通过Sql语句配合ISelect生成最终的Sql语句,也可以执行原生自定义Sql语句,使操作更灵活:通过sql语句与Iselect配合使用更好控制sql语句: 简单查询 _ ...

  4. 推荐几款开源且免费的 .NET MAUI 组件库

    前言 今天大姚给大家推荐 3 款开源且免费的 .NET MAUI 组件库. .NET MAUI介绍 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML ...

  5. Typecho博客网站底部添加网站已运行时间教程

    样式一: 1. 将代码放入 functions.php 一般在主题根目录:网站 /usr/themes/ 主题 修改一下你自己的网站时间 // 设置时区 date_default_timezone_s ...

  6. Sqoop2 - [01] 安装部署

    1.启动Hadoop集群 2.将Sqoop2的安装包上传到合适的目录中解压 tar -zxvf sqoop-1.99.7-bin-hadoop200.tar.gz 3.修改Hadoop的配置文件cor ...

  7. 关于JS中继承

    继承,我理解就是把所有实例可能用到的属性和方法抽出来,单独放在一个"超类"中,一方面避免重复写代码,另一方面也会节省内存.如果单独用原型继承,引用值的处理是个问题 如果单独用cal ...

  8. 【编程思想】C# delegate 委托的本质:方法对象的应用

    一.前言 翻回之前写的博客,前期写的结构确实差很多, 这次细看了<委托那些事(一).(二)>,忍不住重新写一下,之前把简单的事情复杂化了. 为什么现在思维不一样了,有一点我认为是见识的计算 ...

  9. 如何编写正确高效的Dockerfile

    Dockerfile是什么 Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像.拷贝文件.运行脚本等等,RUN, COPY, ADD指令都会生成一个 Lay ...

  10. 想查看某些网站源码,结果发现网站F12被禁用,怎么解决?

    当我们访问某些网站的时候,发现网站是禁用了F12和右键功能的.比如想保存网页上的一些文字或图片等, 新手不知道怎么破除. 下面分享给大家几种方法:1.打开网页后,鼠标点进浏览器地址栏,再按F12键,就 ...