GC算法实现篇之并发标记清除

GC算法实现篇之并发标记清除

简述

并发标记清除是一种适用于堆内存的垃圾回收算法,通常用于大型的应用程序或者需要长时间运行的应用程序中。其主要的特点是多线程标记和清除,相对于其他垃圾回收算法,具备了更好的性能表现。

基本流程

并发标记清除的基本流程如下:

  1. 初始状态:堆中的所有对象都被标记为“未标记”

  2. 初始标记:从根对象开始,对所有可达的对象进行标记。该过程是单线程的执行过程,它会暂停用户线程,阻塞整个应用程序。当初始标记完成后,应用程序会恢复运行。

  3. 并发标记:该阶段可以并发运行,也就是说可以和用户线程同时进行。从根对象出发,对所有可达的对象进行标记,并建立一张被标记对象的清单表。

  4. 并发清除:该阶段可以并发运行,只有在完成了并发标记阶段后,才能执行并发清除。清除没有标记过的全对象,并且更新对象引用。

  5. 再标记:该阶段针对第三阶段的并发标记期间存在的问题。由于并发标记过程中,用户线程还在执行,因此必然会出现部分对象的标记状态发生改变,而这些标记状态发生改变的对象需要重新标记。此阶段也是单线程执行的。

  6. 稳定阶段:当第五阶段的再标记完成后,就进入了稳定阶段。在这个阶段中,用户线程和标记线程都已经停止了,堆中的所有垃圾都被清除掉了。系统进入到一个稳定状态,等待用户线程的下一轮运行。

示例

下面通过一个示例来说明一下并发标记清除的基本流程。

示例1

假设有以下代码:

public void test(){
  List<String> list = new ArrayList<>();
  for(int i=0;i<1000000;i++){
    list.add("item:"+i);
  }
}

在这个方法中,会创建一个新的ArrayList对象list,并且向其中添加1000000个字符串。那么在这个过程中,会创建出非常多的String对象,这些String对象大部分是不需要运行时使用的,因此需要回收。

当JVM调用垃圾回收器时,会执行并发标记清除的算法。在这个过程中,需要执行以下几个步骤:

  1. 初始标记:此时会标记出list对象以及其中的所有String对象,这个过程需要暂停用户线程。

  2. 并发标记:运行时,我们假设JVM创建了4个线程来执行标记操作。在并发标记的过程中,可以和用户线程同时进行操作,这个过程中会标记出所有的可达对象,而不会标记不可达对象。

  3. 并发清除:清除所有未标记的对象,并将存活的对象向空间中移动。

  4. 再标记:由于并发标记的过程中,用户线程可能会改变某些对象的状态,因此需要再次对这些对象进行标记,以保证这些对象不会被误清除。这是一个单线程的过程。

  5. 稳定阶段:此时系统进入到一个稳定状态,等待用户线程的下一轮运行。

示例2

假设有以下代码:

public class Node {
  private Node next;
  private Object value;

  public Node(Object value) {
    this.value = value;
  }

  public void setNext(Node next) {
    this.next = next;
  }

  public Node getNext() {
    return next;
  }
}

public void test(){
  Node node1 = new Node("item:1");
  Node node2 = new Node("item:2");
  Node node3 = new Node("item:3");
  node1.setNext(node2);
  node2.setNext(node3);
}

在这个方法中,会创建出3个Node对象,每个对象中都包含一个字符串对象。在将node1和node2、node2和node3连接时,会引用相互指向,形成了一个对象图。当JVM调用垃圾回收器时,会执行并发标记清除的算法。在这个过程中,需要执行以下几个步骤:

  1. 初始标记:此时会标记出node1, node2, node3以及其中的所有字符串对象,这个过程需要暂停用户线程。

  2. 并发标记:运行时,我们假设JVM创建了4个线程来执行标记操作。在并发标记的过程中,可以和用户线程同时进行操作,这个过程中会标记出所有的可达对象,而不会标记不可达对象。

  3. 并发清除:清除所有未标记的对象,并将存活的对象向空间中移动。

  4. 再标记:由于并发标记的过程中,用户线程可能会改变某些对象的状态,因此需要再次对这些对象进行标记,以保证这些对象不会被误清除。这是一个单线程的过程。

  5. 稳定阶段:此时系统进入到一个稳定状态,等待用户线程的下一轮运行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:GC算法实现篇之并发标记清除 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Linux高并发踩过的坑及性能优化介绍

    Linux高并发踩过的坑及性能优化介绍 前言 首先需要明确的是,在开发高并发应用时,绝不仅仅是写出高并发的代码就够了,还需要在系统层面、网络层面和硬件层面做出一系列的优化,才能真正提高系统的性能和稳定性。 在本文中,我将从以下几个方面来讲解“Linux高并发踩过的坑及性能优化介绍”: 系统层面的优化 网络层面的优化 硬件层面的优化 系统层面的优化 1. 文件…

    多线程 2023年5月16日
    00
  • java并发包中CountDownLatch和线程池的使用详解

    Java并发包中的CountDownLatch和线程池是常用的并发编程工具,其使用详解如下: CountDownLatch 介绍 CountDownLatch是一个计数器,用来控制一个或多个线程等待多个线程的执行完成。CountDownLatch的构造方法接收int类型的参数,该参数就是计数器的初始值。当一个线程完成自己的任务后,计数器的值就会减1,当计数器…

    多线程 2023年5月17日
    00
  • 详解JUC并发编程之锁

    详解JUC并发编程之锁 什么是锁 锁是Java并发编程中用于控制多个线程访问共享资源的机制。在多线程环境下,由于线程运行的不确定性,多个线程可能会同时访问同一个共享资源,导致数据不一致、程序崩溃等问题。锁机制可以保证同一时刻只有一个线程能够访问共享资源,从而达到并发安全的目的。 Java中的锁分类 Java中的锁主要分为两类:内部锁(synchronized…

    多线程 2023年5月17日
    00
  • Java countDownLatch如何实现多线程任务阻塞等待

    Java中的CountDownLatch是一个同步工具类,它的主要作用是让一个或多个线程阻塞等待其它线程完成某些操作后再继续执行,可以很好地实现多线程任务的协调。 CountDownLatch的实现方式是通过一个计数器来实现的,初始化时需要传入一个计数器的值,每当一个线程完成相关操作后,计数器的值就会减1,直到计数器的值为0时,所有因调用await()方法而…

    多线程 2023年5月16日
    00
  • C语言通过案例讲解并发编程模型

    C语言通过案例讲解并发编程模型 什么是并发编程模型? 并发编程模型是指一种应用程序设计的方法,通过该方法,应用程序可以让多个任务并行执行。在并发编程中,任务并不是按顺序依次执行的,而是在同时执行。并发编程旨在提高应用程序的效率,使其可以更快地执行任务。 为什么需要并发编程模型? 现代计算机硬件通常都有多核处理器,这意味着计算机可以同时执行多个任务。如果我们的…

    多线程 2023年5月17日
    00
  • 实例代码讲解JAVA多线程

    下面我将详细讲解“实例代码讲解JAVA多线程”的完整攻略,包含如下内容: 一、多线程基础知识 1. 线程的概念及创建 线程是指在单个程序中同时运行的多个执行单元,每个线程都有独立的执行路径。Java中通过继承Thread类或实现Runnable接口的方式创建线程,具体代码实例如下: public class MyThread extends Thread {…

    多线程 2023年5月17日
    00
  • Java中线程的基本方法使用技巧

    Java中线程的基本方法使用技巧 1. 线程的创建 Java语言支持线程的创建,常用的线程创建方式有两种:继承Thread类与实现Runnable接口。 1.1 继承Thread类 继承Thread类是一种比较直接的方式,只需要重写Thread类的run()方法即可实现线程的创建。 class MyThread extends Thread { public…

    多线程 2023年5月16日
    00
  • java多线程编程之从线程返回数据的两种方法

    首先让我们来了解几个基本的概念: 线程(Thread):计算机中最小的执行单元之一,负责执行程序中指定的任务。 多线程(Multithreading):指在同一个程序中同时执行多个线程,避免单一线程运行太慢造成CPU的浪费。 线程返回数据(Thread Return Data):线程计算完成后,将得到的结果返回给主线程,主线程可以做出相应的操作。 为了实现线…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部