【GC垃圾回收算法】让内存垃圾无处藏身

news2024/11/26 4:22:08

文章目录

  • 概述
  • 垃圾对象的判定
    • 引用计数
    • 可达性分析
  • 回收垃圾
    • 标记清除
    • 复制算法
    • 标记整理
    • 分代回收

概述

垃圾回收就是帮我们把不用的内存垃圾自动释放掉

什么是垃圾呢?就是指不再使用的垃圾

如果不进行垃圾回收就会导致一个严重的问题,内存泄漏

内存泄漏: GC无法及时识别可以回收的内存进行释放,也就是内存占着不用也释放不了,导致内存的浪费,以至于后续的内存申请都会操作失败

如果内存泄漏的越多就会导致内存溢出

内存溢出: 程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中

内存泄漏是一个很严重的问题,所以大佬们就想了一些办法来解决这个问题,而GC就是其中最主流的一种方式

  • GC的好处:让程序猿写代码简单点,不容易出错
  • GC的坏处:需要消耗额外的系统资源,也有额外的性能开销

GC还有一个比较关键的问题STW(Stop The World)问题

有时候垃圾很多,触发一次GC,开销会非常大,把系统资源吃掉很多,另一方面,GC回收垃圾的时候会涉及一些锁的操作,导致业务代码无法正常执行

JVM中存在许多内存区域,像堆,栈,元数据区等,GC主要针对堆进行释放的,GC是以“对象”为基本单位进行回收的,回收的是整个对象都不再使用的这种情况,而不会回收半个对象(一部分使用,一部分不再使用)

GC的工作过程分为两个步骤:

  1. 找/判定垃圾:找到内存中不再使用的对象,判定其为垃圾
  2. 释放垃圾:找到不再使用的对象后,释放对象

垃圾对象的判定

判定对象是垃圾的关键点在于是否有引用指向它

引用计数

注意: 引用计数不是Java中采用的方法,而是Python,PHP采用的方法

引用计数就是给每个对象分配了一个计数器,如果每次创建一个引用指向该对象,则计数器+1,如果每次销毁一个引用,该计数器-1,如果计数器为0,则判定为垃圾

缺点:

  1. 内存空间利用率低,因为每个对象都要分配空间给计数器使用
  2. 存在循环引用问题
public class Test  {
    Test t = null;

    public static void main(String[] args) {
        Test t1 = new Test(); //对象1引用计数为1
        Test t2 = new Test(); //对象2引用计数为1
        t1.t = t2; //对戏2引用计数为2
        t2.t = t1; //对象1引用计数为2
    }
}

说明: 如果将t1和t2销毁,那么对象1和对象2的引用计数都为1,但是此时引用计数不为0,不能判定为垃圾,但实际上这两个对象已经不能被访问到了

所以Java没有采用引用计数这种方法,Python,PHP使用引用计数需搭配其它的机制来避免这种循环引用的问题

可达性分析

Java中的对象都是通过引用来指向并访问的,并且一个引用指向的对象,该对象的成员通常又指向别的对象

可达性分析就是把所有这些对象被组织的结构视为是树,从树的根节点(GCRoots)出发遍历树,所有能被访问到的对象就标记为“可达”,不能访问到的对象就是不可达
JVM有一个所有对象的名单,通过上述遍历,把能访问到的标记为可达,剩下未标记的就是不可达的就会判定为垃圾

遍历的起点称为GCRoots,通常可作为GCroots有以下几类:

  • 栈上的局部变量
  • 常量池中的对象
  • 静态成员变量

回收垃圾

标记清除

该种方法简单粗暴,直接清除垃圾
在这里插入图片描述

缺点: 存在内存碎片问题,因为释放的空闲空间不是连续的,但是申请内存时要求是连续空间,需要申请大一点的内存时,总的内存是够的,但都是零散的,零散的内存不够,此时就会申请失败

复制算法

  1. 该方法是将内存分成两半,每次只用一半
    在这里插入图片描述

  2. 把不是垃圾的对象复制到另一半,然后把整个空间删掉
    在这里插入图片描述

  3. 每次触发复制算法都是把内存中的数据往另外一侧复制

此方法解决了内存碎片问题
缺点: 空间利用率低,如果垃圾少,有效的对象多,复制成本就很大

标记整理

此方法类似顺序表删除中间元素,会有元素搬运的操作
在这里插入图片描述

让存活的对象往一端移动,直接清除存活对象边界之外的内存

保证了空间利用率,也解决了内存碎片问题
缺点: 效率低,元素搬运的空间比较大那开销也大

标记整理只解决了复制算法中空间利用率低的问题,没有解决复制成本大的问题

分代回收

上述的回收策略都不完美,所以基于上述策略搞了一个复合策略分代回收

那分代是咋分的呢?

  • 基于经验规律,如果一个对象存活时间长,那么还会长时间的存活下去
  • Java对象的生命周期要么特别短,要么特别长
  • 根据生命周期的长短,分别使用不同的算法

给对象引入一个年龄,单位为经历GC的次数,如果经历GC的次数越长,说明该对象存活的时间越长

JVM将堆划分为一系列区域
在这里插入图片描述

  • 刚new出来的对象放在伊甸区(伊甸区大,幸存区小)
  • 熬过一轮GC,对象就要被放到幸存区(基于复制算法)了(Java中的大部分对象生命周期都很多,熬不过第一轮GC)
  • 在幸存区的对象,如果不是垃圾就会被拷贝到另一个幸存区(幸存区只会使用一个),然后直接清除现在的幸存区空间,后序的几轮GC都在这两个幸存区之间来回拷贝(复制算法)
  • 如果对象在幸存区来回拷贝许多次了,那么该对象就会进入老年代
  • 针对老年到,也要进行GC,只是GC的频率降低了,如果老年代的对象是垃圾了,使用标记整理的方式释放

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

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

相关文章

【id:34】【20分】D. Point_Array(类+构造+对象数组)

题目描述 上面是我们曾经练习过的一个习题,请在原来代码的基础上作以下修改:1、增加自写的析构函数;2、将getDisTo方法的参数修改为getDisTo(const Point &p);3、根据下面输出的内容修改相应的构造函数。 然后在主函数中根据…

HTTP伪造

打开后是一个精美的页面,再精美也没啥用,先查看源码吧可以看到这里有个点击触发的a标签,点进去后提示我不来自https://Sycsecret.buuoj.cn,结合题目是HTTP,立刻就想到了HTTP请求头伪造抓包,本身是没有Refer…

ActiveMQ使用(一):在JavaScript中使用stomp.js

ActiveMQ使用(一):在JavaScript中使用stomp.js 1. 环境准备 jQuery-1.10 下载地址:https://www.jsdelivr.com/package/npm/jquery-1.10.2?tabfilesstomp.js 2.3.3: 下载地址:https://www.jsdelivr.com/package/npm/stompjs 2. 相关代码 <!DOCTYPE html> <html l…

东用科技路由器连接上云助手配置指导手册

一、上云助手操作步骤1.安装“Device control center”并启动。2.点击“服务器设置”后设置端口号&#xff1a;1-65535&#xff0c;传输协议&#xff1a;TCP/UDP。##路由推送功能默认不勾选。其功能为将填写的远端子网及掩码信息推送给客户端&#xff0c;客户端就会生成一条目的…

java反序列化 cc链1 分析

这里我是跟白日梦组长学习&#xff0c;果然大佬就是大佬&#xff0c;讲的是真好&#xff0c;按他的配置&#xff0c;我们来配置环境。 环境搭建 环境&#xff1a; java&#xff1a;java8u_65 commons-collections&#xff1a;3.2.1 这里逛了很多圈&#xff0c;说实在的真的没有…

融云出海赋能会干货回顾 | 用户增长、场景玩法、安全合规实用指南

近期&#xff0c;“纵浪潜海 2023 融云社交泛娱乐出海赋能会”在上海、广州相继举行。移步【融云全球互联网通信云】&#xff0c;回复【出海】获取PPT。 作为更专业的出海服务商&#xff0c;融云联合多家出海服务企业&#xff0c;从热门出海地区的特性洞察、玩法解决方案、技…

BGP过滤(社团属性过滤器、AS路径过滤器)

通过路由策略来过滤 [r2]ip ip-prefix aa permit 172.16.1.0 24 [r2]route-policy aa deny node 10 [r2-route-policy]if-match ip-prefix aa [r2]route-policy aa permit node 20 [r2]bgp 200 [r2-bgp]peer 10.1.23.3 route-policy aa export 前缀列表进行过滤 [r3]ip ip-pref…

新手使用Python开发游戏pygame入门很合适-02

前面一篇博文&#xff0c;我们让飞机动起来了&#xff0c;但不是那么完美&#xff0c;我们继续来完善我们的游戏代码&#xff0c;本篇博文主要介绍获取按键的方式已经飞行速度的控制。 文章目录一、获取按键的三种方式1、通过event.get配合pygame.key枚举2、通过event.get配合o…

本地测试Segment Anything

一、下载GitHub代码 官网地址&#xff1a; https://github.com/facebookresearch/segment-anything git clone 或者 下载ZIP压缩包 二、下载.pth文件 官网中给出了三个训练好的参数文件 点击下载&#xff0c;我这里下载了最后一个358M大小的模型&#xff08;这里可以使用迅…

apache 配置与应用以及网页优化

Apache 配置与应用 --------构建虚拟 Web 主机-------- 虚拟Web主机指的是在同一台服务器中运行多个Web站点&#xff0c;其中每一个站点实际上并不独立占用整个服务器&#xff0c;因此被称为“虚拟”Web 主机。 通过虚拟 Web 主机服务可以充分利用服务器的硬件资源&#xff0c…

49.现有移动端开源框架及其特点—MACE( Mobile AI Compute Engine)

Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算设备优化的深度学习前向预测框架 MACE覆盖了常见的移动端计算设备(CPU,GPU和DSP),并且提供了完整的工具链和文档,用户借助MACE能够很方便地在移动端部署深度学习模型MACE已经在小米内部广泛使用并且被充分验证具…

答疑——20年国赛题(JAVA解法)

题目链接&#xff1a;用户登录https://www.lanqiao.cn/problems/1025/learning/?page3&first_category_id1&sortstudents_count 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老…

SQL笔记(1)——MySQL创建数据库(收藏吃灰版)

本文详细记录MySQL创建一个数据库的过程&#xff0c;不只是构建步骤&#xff0c;更多的是每一步涉及到的知识点。一般创建数据库有两种方式&#xff0c;一种是命令&#xff0c;另外一种就是通过数据库管理工具&#xff0c;本文主要记录通过命令的方式创建&#xff1b; 后面的学…

Centos7升级make和gcc版本到最新

Background 遇到如下的问题可能就是你make和gcc的版本过低了&#xff0c;需要升级。 *** These critical programs are missing or too old: make compiler *** Check the INSTALL file for required versions. 1、更新make版本 下载最新版本 【make最新安装包下载地址】 #…

VuePress1.x使用及个人博客搭建

文章目录介绍快速开始安装目录页面配置介绍 VuePress 由两部分组成&#xff1a;一个以 Vue 驱动的主题系统的简约静态网站生成工具&#xff0c;和一个为编写技术文档而优化的默认主题。它是为了支持 Vue 子项目的文档需求而创建的。 快速开始 安装 首先需要安装Node.js &…

ASM字节码处理工具原理及实践(一)

1. ASM简介 我们知道程序的分析。生成和转换是很有用的技术&#xff0c;可以用于很多场景。ASM作为一个Java字节码处理工具&#xff0c;它被设计用于处理已编译的Java类。ASM不是生成和转变已编译的Java类的唯一工具&#xff0c;但它是最新且最有效的工具之一。特点是体积小&a…

一个实现跳转到更多页面的黏性交互的通用组件

本文字数&#xff1a;3344字预计阅读时间&#xff1a;9分钟背景和现状随着移动互联网的快速发展&#xff0c;通信费用大幅降低&#xff0c;信息爆炸&#xff0c;应用软件展示的信息越来越来&#xff0c;为了有效地组织和展示信息&#xff0c;各大移动平台都提供了列表滚动组件方…

No.038<软考>《(高项)备考大全》【第22章】信息安全管理

【第22章】信息安全管理1 考试相关2 信息安全管理2.1 安全策略2.2 信息系统安全等级保护2.3 安全的概念适度安全的观点&#xff1a;木桶效应的观点&#xff1a;2.4 安全策略设计2.5 信息安全系统工程能力成熟度模型ISSE-CMM2.6数字证书护照和签证2.7访问控制授权方案2.8 安全审…

评估数据质量的指标总结1

评估数据质量的指标总结1 1、RMSE&#xff08;root mean square error&#xff09;均方根误差 作用&#xff1a;RMSE是估计的度量值与“真实”值之间的距离的度量。 计算方法&#xff1a; 2、相关系数r(coefficient of correlation ) 作用&#xff1a;皮尔逊相关系数&#xff…

LeetCode算法小抄--二叉树的各种构造

LeetCode算法小抄--各种情况的构造二叉树构造二叉树构造最大二叉树[654. 最大二叉树](https://leetcode.cn/problems/maximum-binary-tree/)从前序与中序遍历构造二叉树[105. 从前序与中序遍历序列构造二叉树](https://leetcode.cn/problems/construct-binary-tree-from-preord…