秋招突击——8/15——知识补充——垃圾回收机制
文章目录
- 引言
 - 正文
 - 指针引用
 - 可达性分析算法
 - 垃圾回收算法
 - 标记清除算法
 - 标记整理算法
 - 复制
 - 分代收集
 
- 垃圾收集器
 - 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调优呀等等,都没有看!
 
相关文章:
秋招突击——8/15——知识补充——垃圾回收机制
文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器(Garbage First垃圾优先&#x…...
【iOS】UITableViewCell的重用问题解决方法
我自己在实验中对cell的重用总结如下: 非自定义Cell和非自定义cell的复用情况一样: 第一次加载创建tableView的时候,是屏幕上最多也显示几行cell就先创建几个cell,此时复用池里什么都没有开始下滑tableView,刚开始滑…...
开发一个微信小程序商城需要哪些技术栈
开发一个小程序商城需要掌握以下技术栈: 前端技术:包括HTML、CSS和JavaScript,用于定义商城的页面结构、样式设计和交互功能。 微信小程序专用技术:如WXML、WXSS、JavaScript和JSON,用于描述小程…...
望繁信科技荣膺上海市浦东新区博士后创新实践基地称号
近日,上海望繁信科技有限公司(简称“望繁信科技”)凭借在大数据流程智能领域的卓越表现,成功入选上海市浦东新区博士后创新实践基地。这一荣誉不仅是对望繁信科技创新能力和技术实力的高度认可,也标志着公司在推动产学…...
Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、代理原理 1、反向代理产生的背景 单个服务器的处理客户端(用户)请求能力有一个极限,当接入请求过多时&#…...
Ubuntu20.4 系统安装后无wifi图标
0. 问题排查 1.检查 BIOS 设置: 有时候,无线网卡可能在 BIOS 中被禁用。重启电脑,进入 BIOS 设置,确保无线网卡选项是启用的。 2.检查硬件开关: 检查您的笔记本电脑是否有物理开关或键盘快捷键来启用或禁用无线网卡。 3.在软件更新中切换…...
牛客网SQL进阶135 :每个6/7级用户活跃情况
每个67级用户活跃情况_牛客题霸_牛客网 0 问题描述 基于用户信息表user_info、、试卷作答记录表exam_record、题目练习记录表practice_record,统计 每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数,结果 按照总…...
SQLite3使用接口写入二进制文件
使用接口的方式写入二进制文件 ,有二种方案。 一、全部文件 一次性写下到数据中 使用sqlite3_bind_blob接口 FILE* fpfopen("user.bmp","rb"); iLenfread(buffer,1,65535,fp); fclose(fp);sqlite3_prepare(pDB,"insert into user values …...
在复杂的数据库架构中,如何优化 SQL 查询以提高性能和减少资源消耗?
在优化 SQL 查询以提高性能和减少资源消耗时,可以考虑以下几个方面: 使用索引:为经常被查询的列创建索引,可以大大加快查询速度。同时,避免过多的索引,因为过多的索引会增加写入操作的开销。 编写高效的查…...
【HarmonyOS】端云一体化初始化项目
简介 端云一体化开发是HarmonyOS对云端开发的支持、实现端云联动。云开发服务提供了云函数、云数据库、云存储等服务,可以使开发者专注于应用的业务逻辑开发,无需关注基础设施,例如:服务器、操作系统等问题。 因此,…...
LLM之KG:利用大语言模型(LLM)对文本语料提取概念和概念之间的语义关系进而实现自动构建知识图谱
LLM之KG:利用大语言模型(LLM)对文本语料提取概念和概念之间的语义关系进而实现自动构建知识图谱 目录 ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例 LLMs之AutoKG:《大型语言模型在知识图…...
Spring Security 6如何使用?
Spring Security 6 是一个功能强大且高度可定制的身份验证和访问控制框架,它专注于为基于Java的应用程序提供全面的安全解决方案。以下是对Spring Security 6的详细解析: 一、核心功能 身份验证(Authentication): 验…...
PyTorch深度学习快速入门教程--学习笔记
目录 P4 PyCharm和Jupyter的对比 P5 PyTorch加载数据 P6 Dataset类代码实现 P7 Tensorboard 写日志 读取日志文件 Tensorboard 读图片 P10 Transforms使用 Transforms用途 常见的Transforms工具 P14 torchvision数据集使用 P15 Dataloader使用 P16 nn.Module模块使…...
SQLALchemy 分组过滤、子查询
SQLALchemy 分组过滤、子查询 分组和过滤(Group By Having)示例:使用ORM示例:使用SQLAlchemy Core子查询(Subquery)SQLAlchemy 是一个流行的 SQL 工具包和对象关系映射(ORM)库,用于 Python 应用程序。它允许你以 Pythonic 的方式使用 SQL 数据库,同时提供了强大的查询…...
华为od(D卷) 环中最长子串/字符成环找偶数LOX
文章目录 题目描述输入描述输出描述示例1示例2示例3思路代码 题目描述 给你一个字符串 s,字符串 s 首尾相连成一个环形,请你在环中找出 ‘l’、‘o’、‘x’ 字符都恰好出现了偶数次最长子字符串的长度。 输入描述 输入是一串小写的字母组成的字符串 …...
机器学习--常见算法总结
有监督学习算法 1. 线性回归算法 概念:线性回归是一种统计方法,用于预测一个变量(因变量)与一个或多个自变量(特征变量)之间的关系。目标是通过线性方程建立自变量和因变量之间的关系模型。 作用&#x…...
QT 网络聊天室简易版
视频:qt开发网络聊天w室软件3.4界面开发_哔哩哔哩_bilibili 目录 UI部分 设计稿图 放置控件 界面美化 拖动窗体 设置界面 网络部分 配置对话框 多项目结果和服务器端设计 客户端框架开发 UI部分 设计稿图 放置控件 界面美化 现在我们把窗体自带的标题栏给去了,用我们自…...
Linux_Shell三剑客grep,awk,sed-08
三剑客的概述: awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找…...
uniapp实现足球数据分析平台移动端H5
文章目录 前言一直想做一款足球分析平台,大概内容包括竞彩分析模块,即时预测模块,初盘分析模块,找来找去还是前端铺子的样式感觉比较好看。 一、界面一栏二、注册界面1.代码说明 三、首页界面四、竞彩预测五、即时预测总结 前言 …...
Redis5优化-Redis
1、Redis关键参数 a、客户端最大连接数 maxclients 60000 注意该参数受到操作系统最大文件句柄的限制(ulimit -n) b、响应 repl-ping-slave-period/repl-timeout repl-timeout 60 1)、说明:slave 会每隔 repl-ping-slave-period(默认10秒)ping一次mast…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
