秋招突击——8/15——知识补充——垃圾回收机制

news2024/11/16 9:32:21

文章目录

    • 引言
    • 正文
      • 指针引用
      • 可达性分析算法
      • 垃圾回收算法
        • 标记清除算法
        • 标记整理算法
        • 复制
        • 分代收集
      • 垃圾收集器
        • Serial收集器
        • ParNew并行收集器
        • Parallel Scavenge吞吐量优先收集器
        • Serial Old老年代收集器
        • Parallel old收集器
        • CMS收集器
        • G1收集器(Garbage First垃圾优先)
    • 总结

引言

  • 上次面试腾讯,让我说了一下垃圾回收机制,虽然大概都说出来了,但是觉得还是有不够详细,今天好好整理一下,下次不会这么狼狈了!

正文

指针引用

  • Java中对象的访问是需要通过引用进行判断的,引用主要分为其中,按照强度递减分别是:强软弱虚

    • 强引用
      • 通过new创建的对象,直接用=赋值,如果还存在强引用,垃圾回收器绝对不会回收他
    • 软件引用
      • 需要使用SoftReference进行声明
      • 如果内存不够了,要报异常了,这里就要的优先回收软引用
      • 用于对象缓存
    Obj obj = new Obj();
    SoftReference<Obj> sr = new SoftReference<Obj>(obj)
    
    • 弱引用
      • 描述非必须的对象,当一个对象只有弱引用,只要发生GC,一定会被回收
    Obj obj = new Obj();
    WeakReference<Obj> sr = new WeakReference<Obj>(obj)
    
    • 虚引用
      • 最弱的引用,形同虚设
      • 仅仅是当前对象被回收了,我能收到通知

可达性分析算法

  • 通过一系列GC Root的根对象作为起始节点,然后根据引用关系向下搜索,搜索走过的路径就是引用链。

    • GC Root不可达,说明对象不再被使用
    • GC Root可达,说明对象仍旧在使用
  • 固定为GC Root的对象有以下几种

    • 虚拟栈中引用的对象
    • 在方法区,类静态属性引用的对象
    • 在方法区,常量引用的对象
    • 在本地方法栈中Native方法引用的对象
    • Java虚拟机内部的引用
    • 同步锁持有的对象

垃圾回收算法

标记清除算法
  • 找出所有对象,将存活对象进行标记,然后清理掉未标记的对象,结束。
    在这里插入图片描述
标记整理算法
  • 首先找出所有对象,将存活对象进行标记,然后将存活对象整理一端,将内存区域直接清除掉
    在这里插入图片描述
复制
  • 将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了,就将存活对象复制到另外一块上,然后再将使用过的内存空间进行一次清理
    在这里插入图片描述
分代收集
  • 根据对象的存活周期将内存划分为几块,不同块采用不同的收集算法。
  • 一般分为新生代和老年代,
    • 新生代
      • 绝大多数的对象都是活不过一次垃圾回收
      • 使用复制算法
    • 老年代
      • 大多数是熬过了很多次垃圾回收过程的对象。
      • 标记清除 或者 标记整理算法

垃圾收集器

  • 目前常用的hotpot虚拟机支持其中垃圾收集器,可以混用。
    在这里插入图片描述
Serial收集器
  • 基本流程
    • 暂停所有的工作线程,专门进行垃圾回收
  • 针对对象
    • 新生代
  • 算法
    • 复制算法
ParNew并行收集器
  • 多线程版的Serial收集器
  • 基本流程
    • 暂停所有工作线程,使用多线程进行垃圾回收
  • 针对对象
    • 新生代
  • 算法
    • 复制算法
Parallel Scavenge吞吐量优先收集器
  • 多线程垃圾收集器,尽量压缩垃圾收集时,用户线程的停顿时间

  • 基本流程

    • 暂停所有工作线程,使用多线程进行垃圾回收
  • 针对对象

    • 新生代
  • 算法

    • 复制算法
  • 注意

    • 需要控制最大垃圾收集停顿时间
    • 设置吞吐量大小
Serial Old老年代收集器
  • Serial收集器的老年版,使用标记-整理算法,提供客户端模式下使用
  • 基本流程
    • 暂停所有工作线程,使用多线程进行垃圾回收
  • 针对对象
    • 老年代
  • 算法
    • 标记整理算法
Parallel old收集器
  • 多线程垃圾收集器,尽量压缩垃圾收集时,用户线程的停顿时间

  • 基本流程

    • 暂停所有工作线程,使用多线程进行垃圾回收
  • 针对对象

    • 老年代
  • 算法

    • 复制算法
  • 注意

    • 应用于处理器资源较为稀缺的场合,考虑使用Parallel Scavenge 和 Parallel Old一块使用
CMS收集器
  • 追求最短停顿时间的垃圾收集器

  • 基本流程

    • 初始标记
      • 停下所有线程,仅仅标记一下GC Root能够关联的对象
    • 并发标记
      • 用户线程并行,进行GC Roots Tracing,耗时最长
    • 重新标记
      • 修正并发期间因为程序调用导致的标记变动,停下所有工作线程,耗时较短
    • 并发清除
      • 用户线程并行,清除掉死亡对象
  • 总结

    • 吞吐量低,但是停顿时间少,完成垃圾回收时间长,但是是并行的
    • 使用标记清除算法,内存空间不连续,大量的空间碎片
G1收集器(Garbage First垃圾优先)
  • 将内存进行分区,然后进行回收价值和成本排序,价值越高成本越低的区块优先回收。

  • 特性和问题总结:

    • 将整个堆分成大小相同的Region区域,每一个都是Region都可能是新生代、老年代、Eden空间和Survivor空间
    • G1每次收集的时候,只会收集部分Region,每次收集时,会先估算每一个小块存活对象的总数,回收垃圾最多的小块会先被收集
      • 对于跨Region的引用对象,使用记忆集解决
      • 并发标记阶段如何保证收集县城和用户线程互不干扰的运行
        • 回收过程中改变对象引用关系:通过原始快照SATB算法实现
        • 回收过程中创建新对象:使用单独的分区和指针TAMS保存新创建的对象
  • 四个步骤

    • 初始标记
      • 仅仅标记一下GC Root能够关联的对象(停顿一下)
    • 并发标记
      • 进行可达性分析,完成对象图扫描,判断存活对象和可回收对象
      • 处理STAB记录的是否有引用变动的对象
    • 最终标记
      • 暂时停顿,查看处理并发阶段结束后少量的SATB记录
    • 筛选回收
      • 根据统计的回收价值和成本并排序,筛选region进行回收
      • 使用标记复制的算法实现

总结

  • 这里是粗浅的理解,后续会在有补充,有很多问题都没有解决,包括怎么进行GC调优呀等等,都没有看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于堆的介绍

1.堆的概念及结构 如果有一个关键码的集合&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并满足&#xff1a;且则称为小堆&#xff08;或大堆&#xff09;。将根节点最大的堆叫做最大堆或者大根堆&#xff0c;根节点最小的堆叫做最小…

【Linux】:进程控制(创建、终止、等待、替换)

目录 1.进程创建 2.进程终止&#xff08;退出&#xff09; 2.1 什么是进程终止 2.2 进程退出的场景&#xff08;原因&#xff09; 2.3 进程退出码 2.4 错误码errno 2.5 进程常见的退出方法 正常终止 从main函数返回 调用库函数exit 系统接口_exit 3.进程等待 3.1 …

【Linux】简易线程池项目

线程池是一个可以巩固一些线程相关接口 && 加强理解的一个小项目。 注意&#xff1a;这里的线程池使用的线程并不是Linux原生接口&#xff0c;而是经过封装的&#xff0c;具体请看线程封装&#xff0c;为什么不使用原生接口&#xff1f; 因为原生接口一旦进行pthread…

2024最新easyrecovery 14中文破解版图文教程

使用EasyRecovery易恢复进行数据恢复非常简单。首先&#xff0c;用户需要选择需要恢复的数据类型&#xff0c;如文档、图片、视频等。然后&#xff0c;软件会对选定的存储设备进行全面扫描&#xff0c;以寻找可恢复的数据。在扫描过程中&#xff0c;用户可以预览部分已找到的文…

成化瓷器“制字衣横少越刀”--还有例外

孙瀛洲先生关于成化款瓷器的名言非常经典&#xff0c;但是&#xff0c;凡事总有以外。 图1&#xff0c;本人收藏成化斗彩鸡缸杯底款&#xff0c;制字的衣横越过双勾刀。 下面是两件台北故宫成化瓷器底款&#xff0c;制字下面的衣横也是越过刀了。 所以&#xff0c;凡事总有例外…

mysql5.7安装

1.创建一个software文件 2.先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 3安装源包 rpm -ivh mysql-community-release-el7-5.noarch.rpm 可能会报错 改成命令 rpm -ivh mysql-community-release-el7-5.noarch.rpm --nodeps…

优化图像处理:从旋转与缩放到水印添加

1. 旋转与缩放的仿射变换 在 OpenCV 中&#xff0c;cv2.getRotationMatrix2D() 函数可以生成旋转矩阵&#xff0c;该矩阵用于对图像进行旋转和缩放变换。旋转矩阵的主要参数是&#xff1a; Center&#xff1a;旋转中心点的坐标 (x, y)。 Angle&#xff1a;旋转角度&#xff0…

数据结构与算法--图的应用

文章目录 回顾提要连通图生成树最小生成树构造最小生成树的算法普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法 最短路径狄杰斯特拉 (Dijkstra) 算法当前最短路径的更新拓扑排序拓扑排序方法拓扑排序示例总结 回顾 图的遍历方法&#xff1a; 深度优先遍历 (DFS)&#xff1a;从任意…

在centos7安装mysql

1.卸载旧环境 ps axj | grep mysql ps axj | grep mariabd 如果是这样就什么都不需要做。 如果不是 2.检查并卸载系统安装包 //检查安装包 rpm -qa | grep mysql//卸载安装包 rpm -qa | grep mysql | xargs yum -y remove 3.安装官方yum源 先查看系统的版本 比如我是7.9版…

力扣高频SQL 50题(基础版)第四十题之1164. 指定日期的产品价格

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十题1164. 指定日期的产品价格题目说明实现过程准备数据实现方式结果截图总结FIRST_VALUE()函数LAST_VALUE()函数NTH_VALUE()函数 LAST_VALUE()函数NTH_VALUE()函数 力扣高频SQL 50题&#xff08;基础版&#xff0…

YJ0043定制版抖音电商卷抢购系统带回收商城抖音电商优惠卷投资理财系统

系统是基于逍遥商城二开的系统&#xff0c;pc手机端都新增了邀请码验证 手机端重新定制的UI&#xff0c;前端产品不至于抖音卷也可以自行更改其他产品 用户前端下单&#xff0c;后台订单可以直接回收&#xff0c;后台支持设置默认邀请码和抢卷时间限制

动手学深度学习(pytorch)学习记录10-从零开始实现softmax回归[学习记录]

注&#xff1a;本代码在jupyter notebook上运行 封面图片来源 导包 import torch from IPython import display import torchvision from torchvision import transforms from torch.utils import data设置加载数据的线程数 def get_dataloader_workers(): ""&qu…

《学会 SpringBoot 系列 · spring.factories 详解》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

机器人阻抗控制之设计方法

机器人阻抗控制的设计方法主要围绕调整机器人与环境之间的动态关系&#xff0c;使其等效为由弹簧-阻尼-质量组成的二阶系统。这一控制策略不是直接控制机器人的运动或其与外界的接触力&#xff0c;而是控制这二者之间的动态关系。以下是机器人阻抗控制设计方法的详细阐述&#…

Centos7系统上安装docker

centos7安装docker 安装之前&#xff0c;一定查看是否安装docker&#xff0c;如果有&#xff0c;卸载老版本 我是虚拟机装的Centos7&#xff0c;linux 3.10 内核&#xff0c;docker官方说至少3.8以上&#xff0c;建议3.10以上&#xff08;ubuntu下要linux内核3.8以上&#xff…

LVS详细配置

目录 LVS简介 LVS集群体系结构 LVS相关术语 lvs集群的类型 1、NAT模式 NAT简介 NAT模式数据逻辑 2、DR模式 DR模式简介 DR模式数据逻辑 DR模式的特点 3、TUN模式 TUN模式简介 TUN模式数据传输过程 TUN模式特点 4、fullnet模式 LVS模式总结 LVS调度算法 LVS静…

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

机器学习(1)--数据可视化

文章目录 数据可视化作用可视化方法实现可视化 总结 数据可视化 数据可视化是将数据以图形、图像、动画等视觉形式表示出来&#xff0c;以便人们能够更直观地理解、分析和交流数据中的信息。 作用 一个整理的好好的数据&#xff0c;我们为什么要将其可视化呢&#xff1f;将它…

深入理解指针

前言&#xff1a;对于指针我们已经有了初步的了解&#xff0c;并已能够简单使用。今天我们来深入理解指针。让我们的指针功力更上一层楼。 1 使用指针访问数组 有了指针的知识&#xff0c;再结合数组的特点&#xff0c;我们就可以使用指针来访问数组了。 #include<stdio.…

线程的进阶学习

线程结束方式: 1.pthread_exit //pthread_join 2.从线程执行函数中return //此时效果等价于pthread_exit 3.pthread_cancel //线程可以被取消 4.任何一个线程调用了exit 或者 主线程 (main函数) return都会造成 进程结束 线程资源回收 ---pthread_join int pthread_ca…