🍳
Between code and words
  • About
    • About Me
    • About Book
  • 技术专辑
    • 大数据BigData
      • Ambari
        • 搭建虚拟机集群以及安装Ambari
          • self
            • 构建b
            • 构建m
            • 构建s
            • 构建集群
          • Windows
            • +VMware从头完全部署
            • +Docker从已有镜像简易部署
          • Linux
            • +Docker从头完全部署
            • +Docker从已有镜像简易部署
      • CDH
      • Maven
        • 一个简单的项目
        • GitHub远程maven私人仓库
      • Hadoop
        • HDFS介绍
        • MapReduce介绍
        • YARN介绍
        • HDFS常用命令
      • Hive
        • Hive简介及核心概念
        • Hive CLI和Beeline命令行的基本使用
        • ambari安装Hive
        • Hive常用DDL操作
        • Hive常用DML操作
        • Hive常用DCL操作
        • Hive分区表和分桶表
        • Hive 视图和索引
        • Hive数据查询详解
        • 进阶-优化
        • 进阶-函数
        • 进阶-Brickhouse UDF
        • 进阶-接入Python
      • 帮助
        • 常用端口
        • 常用命令
        • QA
    • 项目Program
      • 大数据项目实践
        • 1 亿条淘宝用户行为数据分析
          • 1. 部署环境
          • 2. 数据集下载
          • 3. 数据处理和表优化
          • 4.数据分析
          • 5.可视化
      • Web实践-Qhubl
        • 第一章-概
        • 第二章-面向公众的前后端
        • 部署指导
      • GNN
        • 1. 环境配置
        • 2. 节点分类
          • 数据集
            • Cora.py
          • 模型
            • GCN.py
            • GAT.py
          • Utils
            • draw.py
            • TTV.py
      • 美亚柏科
    • Linux
      • Linux
        • 常见
        • 代理
        • 科学计算
          • MPAS7
        • WSL
          • WSL数据迁移
          • 安装Docker Engine
        • 脚本
        • QA
      • Git
        • QA
      • VMware
        • 虚拟机代理
        • 双向复制粘贴
        • 磁盘扩容
        • QA
      • Docker
        • WSL安装Docker Engine
        • 优雅的上代理
        • 优雅地给容器新添端口
        • QA
      • MySQL
        • 重置初始密码
        • 免输密码登录
        • 低密码策略脚本
        • DeBug
    • Java
      • 语言特性
        • 多线程
        • AQS
        • JVMG1
      • 框架
        • SpringBoot
          • 注解
          • 配置
          • YAML
  • Self
    • 电脑应用
    • 奖项存档
    • 日语笔记
      • 入门五十音
      • 入门音调声调
    • 读书笔记
      • 《贫穷的本质》
        • 前言
        • 第一章 再好好想想
        • 第二章 饥饿人口已达到10亿?
Powered by GitBook
On this page
  1. 技术专辑
  2. Java
  3. 语言特性

JVMG1

JVM Garbage First

PreviousAQSNext框架

Last updated 1 year ago

Java有三个基础GC 算法

Mark-Sweep标记清除

它分为两个阶段:标记和清除。

标记阶段会遍历所有可达的对象,并将它们标记为存活。清除阶段会删除所有未被标记的对象,即垃圾对象。

这种算法的优点是实现简单,不需要额外的空间。缺点是会产生内存碎片,导致后续分配大对象时可能失败。

Copying拷贝

一种将内存分为两个相等的区域,每次只使用其中一个区域的算法。当这个区域快要用完时,就会将存活的对象复制到另一个区域,并清空原来的区域。

这种算法的优点是不会产生内存碎片,且复制过程中不需要暂停应用程序。缺点是浪费了一半的内存空间,且复制大量对象时会影响性能

Mark-Compact标记压缩

一种结合了标记清除和拷贝算法的思想的算法。它也分为两个阶段:标记和压缩。

标记阶段和标记清除算法相同,都是遍历所有可达的对象,并将它们标记为存活。压缩阶段则是将所有存活的对象向内存空间的一端移动,并更新它们的引用地址。

这种算法的优点是既不会浪费内存空间,又不会产生内存碎片。缺点是移动对象和更新引用地址时需要暂停应用程序。

Java有两种GC模型

  • 分代模型

  • 分区模型

在这两种模型之上,Java建立了10中GC,如下图

分代Young
分代Old
分区模型

ParNew

Copying

CMS

Mark-Sweep

G1

Copying和Mark-Compact

Serial

Copying或Mark-Compact

SO

Mark-Compact

ZGC

Copying和Mark-Compact

PS

Copying

PO

Mark-Compact

Shenandoah

Copying和Mark-Compact

分代模型年轻代GC

A stop-of-world(STW), copying collector which uses a single GC thread.

垃圾到一定程度后,所有业务线程停止,GC开始工作。会导致Java程序运行到一定时候出现卡顿。

分代模型年轻代GC

A stop-of-world, copying collector which uses multiple GC threads

Serial如果有太多垃圾,那么STW时间会太长,卡顿严重,可以使用多线程去回收垃圾,但是线程不是越多越好。JDK1.8默认使用PS(Parallel Scavenge)+PO(Parallel Old)。

分代模型老年代GC

concurrent mark sweep

并发清理

GC的标记阶段一般采用三色标记法,但是存在诸多bug,同时也会提到CMS对其解决方案。

其一如下

A及其子已经标记到,B被标记到但其子未标记,D还未标记,此时标记任务停止,业务任务启动

A新引用了D,B取消引用D,变成下图,此时业务任务停止,标记任务启动

标记任务从灰色B继续标记,发现没有子,于是一轮结束,标记AB为有效,D为垃圾。

解决方案有很多,其一如下

在JVM中设计一种屏障,一旦观察到黑色向白色建立引用,将此黑色修正为灰色。这就是CMS对三色标记的修正方案,称为Incremental Update,不过这种方案仍然有非常隐秘的问题,比如A有属性1,2,标记任务将1标记完后,2还没标记,中止切换到业务任务,将1引用

Page cover image