JavaWeb——垃圾回收

news2024/11/25 20:18:27

目录

一、垃圾回收定义

二、垃圾回收处理内存区域

三、垃圾标记

1、引用计数

(1)、定义

(2)、缺陷

2、可达性分析

(1)、定义

(2)、缺点 

四、垃圾回收过程

1、标记清除

(1)、定义

(2)、缺点

2、复制算法

(1)、定义

(2)、缺点

3、标记整理

(1)、定义

(2)、缺点

4、分代算法

(1)、定义

(2)、回收策略

五、垃圾回收器


一、垃圾回收定义

垃圾回收机制(GC)能够帮助程序员自动释放内存。Java等编程语言引入了GC来解决内存泄漏问题,通过JVM自动判断,能够有效的减少内存泄漏的出现概率。

二、垃圾回收处理内存区域

JVM中的内存有四个区域(堆区、栈区、元数据区、程序计数器),堆区是GC的主要目标,其余区域则不需要:

  • 栈会随着线程一起销毁,方法调用完毕后,方法的局部变量会随着出栈操作自动销毁
  • 元数据区存的是类对象,很少会卸载
  • 程序计数器是一个单纯存地址的整数,不需要处理,会随着线程一起销毁

三、垃圾标记

Java对于垃圾对象的识别较为保守,需要最大程度的避免误杀,释放不及时不太重要。一个对象如果后续再也不用,就可以认为是垃圾。Java中使用一个对象只能通过引用,而想要知道一个对象是否有引用指向,可以使用引用计数和可达性分析这两种方法来表明。

1、引用计数

(1)、定义

引用计数是给对象安排一个额外空间用来保存一个整数,表示该对象有几个引用指向。当引用增加时,计数器增加;引用销毁时,计数器减少;计数器为0时,则可认为没有引用,该对象就是垃圾

注:引用计数法实现简单,判定效率较高,Python、PHP等语言就采用引用计数法进行内存管理。但在主流的JVM中没有使用引用计数法来管理内存,最主要的原因就是引用计数法无法解决对象的循环引用问题。

(2)、缺陷

  • 浪费内存空间
  • 存在循环引用的情况,会导致引用计数的判定逻辑出错

当a和b销毁了,两个对象的引用计数各自减一。此时两个对象引用计数都是1,不能作为垃圾但是却不能使用,因此陷入了一个逻辑循环。

2、可达性分析

(1)、定义

可达性分析是把对象之间的引用关系理解成一个树型结构,从一些特殊的起点触发并进行遍历。能遍历访问到的对象就是可达,不可达的就是垃圾。

可达性分析进行上述遍历的起点:

  • 栈上的局部变量(每个栈的每个局部变量都是起点)
  • 常量池中引用的对象
  • 方法区中静态成员引用的对象

总的来说可达性分析就是从所有的的起点出发,查看该对象里通过引用能访问哪些对象,把所有可以访问的对象都遍历一遍,同时把对象标记成可达,剩下的就是不可达的垃圾。

(2)、缺点 

虽然可达性分析克服了引用计数的缺点但也存在问题:

  • 消耗更多时间:扫描过程中需要消耗时间,当某个对象成为垃圾时,不一定能第一时间发现
  • 需要暂停工作(STW问题):在进行可达性分析时需要让其他业务线程暂停工作,防止当前代码中的对象的引用关系发生变化

四、垃圾回收过程

1、标记清除

(1)、定义

标记清除算法是最基础的收集算法,算法分为“标记”和“清除”两个阶段:首先标记出所需回收的对象,然后在标记完成后统一回收所有被标记的对象。

(2)、缺点

  • 效率问题:标记和清除这过程的效率不高
  • 空间问题:标记清除后会产生大量不连续的内存碎片,申请空间都是申请的整块连续的空间,此处的空闲空间是离散的独立空间,因此虽然总的空闲空间充足但是无法申请到足够空间

2、复制算法

(1)、定义

复制算法是为了解决标记清理的效率问题,它将内存划分为大小相等的两块,每次只使用其中的一块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上,然后再把已经使用过的内存区域一次清理掉。每次都是对整个半区进行内存回收,内存分配时不需要考虑内存碎片等复杂情况,只需要移动堆顶指针按顺序分配即可,算法实现简单运行高效。

(2)、缺点

复制算法虽然解决了内存碎片的问题但也有缺点:

  • 内存利用率较低
  • 如果当前的对象大部分都是要保留——垃圾很少,此时复制成本就较高

3、标记整理

(1)、定义

标记整理算法的标记过程与标记清除过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动。这类似于顺序表删除中间元素,有一个搬运的过程,将不是垃圾的对象往前搬运,并把垃圾区域统一释放。

(2)、缺点

虽然解决了内存碎片问题,但是搬运开销较大。

4、分代算法

(1)、定义

分代算法和上述的三种算法不同,其是通过区域划分来实现不同区域和不同的垃圾回收策略,从而实现更好的垃圾回收。当前JVM垃圾收集都采用的是分代收集算法,这个算法并没有新思想,只是根据对象存活周期的不同将内存划分为几块。

Java堆分为新生代和老年代:

  • 新生代:一般创建的对象都会进入新生代。在新生代中每次垃圾回收都有大批对象死去,只有少量存活,因此采用复制算法
  • 老年代:大对象和经历了 N 次(一般情况默认是 15 次)垃圾回收依然存活下来的对象会从新生代移动到老年代。而老年代中对象存活率高,没有额外空间对它进行分配担保,因此必须采用标记清理或标记整理算法

(2)、回收策略

给对象设定年龄概念,用来描述这个对象存在多久。如果一个对象刚诞生就认为是0岁。每经过一次可达性分析,如果没被标记成垃圾该对象就增加一岁。通过年龄来区分这个对象的存活时间。如果一个对象存活时间很长,它将继续存在更长的时间。

  • 新创建的对象放到伊甸区,当垃圾回收扫描到伊甸区后,绝大部分对象都会在第一轮GC中被清理,大多数对象都活不过一岁
  • 如果伊甸区的对象熬过第一轮GC,就可以通过复制算法拷贝到生存区。生存区分成大小均等的两半,一次只使用其中的一半。垃圾回收扫描一半的生存区对象,发现垃圾就淘汰,不是垃圾的通过复制算法,复制到生存区的另一半
  • 当这个对象在生存区熬过若干轮GC后,年龄增长到一定程度,就会通过复制算法拷贝到老年代
  • 进入老年代的对象年龄都很大,再消亡的概率比前面新生代对象小不少,针对老年代的GC的扫描频次会降低很多。如果老年代中发现某个对象是垃圾,就使用标记整理的方式清除
  • 特殊情况如果对象非常大,直接进入老年代(大对象直接使用复制算法)

五、垃圾回收器

  • Serial收集器:新生代收集器,串行GC
  • ParNew收集器:新生代收集器,并行GC
  • Parallel Scavenge收集器:新生代收集器,并行GC
  • Serial Old收集器:老年代收集器,串行GC
  • Parallel Old收集器:老年代收集器,并行GC
  • CMS收集器:老年代收集器,并发GC
  • G1收集器:唯一一款全区域的垃圾回收器

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

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

相关文章

SAP MM 创建双单位采购信息记录

SAP创建不同基本单位的信息记录 1、前台维护MM01 2、ME11维护信息记录 3、通过BAPIBDC实现:ME_INFORECORD_MAINTAIN_MULTIMEK1录屏 因为单独使用ME_INFORECORD_MAINTAIN_MULTI创建信息记录无法创建双单位,创建第一个单位时可以,第二个就会报…

企业邮箱的成本与收费:了解真相,合理选择

企业邮箱的成本对于希望迁移到云端的企业来说可能是一个问题。但这并不一定是必须的。企业邮箱对于今天的企业来说是必不可少的,因为它们提供必要的工具和服务来帮助您与客户、合作伙伴和商业社区保持联系。企业邮箱的收费贵不贵?成本高么? 对…

【Linux】进程间通信 -- 信号量

概念引入为什么要信号量?信号量操作接口1.申请信号量semget2.控制信号量semctl3.处理信号量semop IPC资源的组织方式 概念引入 信号量是什么? 本质是一个计数器,通常用来表示公共资源中,资源数量多少的问题 公共资源&#xff1a…

BUUCTF-JustEscape

目录 信息搜集 bypass 黑名单机制 绕过沙盒执行系统命令 总结 这是一道 Node.js 沙盒逃逸的题目&#xff0c;在此记录一些技巧。 信息搜集 进入题目环境&#xff1a; 直接给出了一个可执行任意代码的入口 /run.php?code<code>&#xff0c;直接复制第二个 demo 的路…

常见安装工具以及命令(工作常用)

dockermongodbnginxredis 1.docker 启动2.docker 安装 MongoDB3.启动nginx4.redis配置&#xff0b;安装4.1 Redis的启动和停止4.2 后台启动方式 1.docker 启动 安装docker # 1.安装gcc和g yum -y install gcc yum -y install gcc-c # 2. 安装需要的软件包 yum install -y yum…

DNS详细解析

文章目录 DNS是什么以及作用下载DNS服务named.conf DNS查询DNS缓存机制解析过程递归查询和迭代查询 DNS服务器的类型DNS域名DNS服务器的类型搭建dns服务器缓存域名服务器主域名服务器从域名服务器排错反向解析 CDN介绍 DNS转发介绍配置 DNS劫持 DNS 是什么以及作用 DNS&#…

WEB:Web_php_include(多解)

背景知识 文件包含 file://协议 php://协议 data://协议 了解strstr函数 题目 <?php show_source(__FILE__); echo $_GET[hello]; /*可以构造payload*/ $page$_GET[page]; while (strstr($page, "php://")) { /*strstr()函数*/$pagestr_replace("php://&q…

JavaSwing+MySQL的购物系统项目

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88052733?spm1001.2014.3001.5503 JDK1.8 MySQL5.7 功能&#xff1a;管理员与用户两个角色&#xff0c;管理员可以对商品进行增删改查处理&#xff0c;用户可以浏览查找商品&#xff0c;注…

CROSSROADS1靶机复盘

CROSSROADS1靶机复盘 这个靶机学会了三个工具enum4linux&#xff0c;smbclient&#xff0c;stegoveritas。枚举服务器可能开启的一些资源&#xff0c;smb扫描工具&#xff0c;还有一个隐写术的工具。 靶场下载地址&#xff1a;https://download.vulnhub.com/crossroads/cross…

4.5.tensorRT基础(1)-onnx文件及其结构的学习,编辑修改onnx

目录 前言1. onnx1.1 导出onnx1.2 读取onnx1.3 创建onnx1.4 编辑onnx1.5 onnx总结1.6 本节知识点 2. 补充知识2.1 Protobuf2.1.1 Protobuf简介2.1.2 基本使用流程 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记…

【Nacos】适配PostgreSQL数据库

目录 本文环境介绍修改application.properties下载PostgreSQL扩展插件初始化PostgreSQL启动测试 本文环境介绍 组件依赖版本Nacos2.2.3OpenJDK17.0.2PostgreSQL Server15 修改application.properties ### Deprecated configuration property, it is recommended to use spri…

手搓一台简单的网络损伤仪——弱网测试

1、介绍 支持对链路带宽、传输时延、丢包率和无码率的手动设置&#xff1b; 1.1、网络损伤仪在使用时&#xff0c;网络拓扑连接 1.2、网络损伤仪管理页面展示 2、使用的设备及相关技术栈 一台Intel 赛扬 J1900的迷你主机【拥有4个千兆网口】&#xff1b;ubuntu-18.04.5-live…

(数组与矩阵) 剑指 Offer 04. 二维数组中的查找 ——【Leetcode每日一题】

❓ 剑指 Offer 04. 二维数组中的查找 难度&#xff1a;中等 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右 非递减 的顺序排序&#xff0c;每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数&#xff0c;输入这样的一个二维数组和一个整数&#x…

使用Stable Diffusion和PyTorch创建艺术二维码

大家好&#xff0c;本文将介绍如何利用Stable Diffusion和PyTorch的能力来创建AI生成的QR码艺术。通过将这些技术相结合&#xff0c;可以生成独特的、具有视觉吸引力的艺术作品&#xff0c;其中包含QR码&#xff0c;为艺术作品增添了互动元素。 Stable Diffusion和PyTorch 稳…

赢得CSDN铁粉的秘诀!(记录写作三个月的点点滴滴)

在CSDN上写博客已经三个多月了&#xff0c;从开始的陌生到渐渐熟悉CSDN网站的每个角落&#xff0c;猛然发现还有这么一个活动&#xff0c;想了想还是写一篇博客吧&#xff0c;不仅是参加活动&#xff0c;也是记录这一路慢慢探索的过程。 1.CSDN铁粉介绍及说明 CSDN 是为中国 I…

C++进阶:map和set

map和set STL容器分为序列式容器和关联式容器。 序列式容器vector、list等底层为线性数据结构&#xff0c;数据元素之间没有联系&#xff0c;一般用来存储数据。关联式容器map、set等底层采用平衡搜索树&#xff0c;存储的是<key/value>式的键值对&#xff0c;数据检索效…

NOSQL简单实战

目录 实战一&#xff1a; 1、 string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; &#xff08;2&#xff09; 读取键值&#xff1a; &#xff08;3&#xff09; 数值类型自增1&#xff1a; &#xff08;4&#xff09; 数值类型自减1&…

基于html2canvas和jspdf将document DOM节点转换为图片生成PDF文件,并下载到本地

这里要用到html2canvas将document DOM节点转换为图片&#xff0c;并下载到本地_你挚爱的强哥的博客-CSDN博客前端用原生js编辑文件内容→创建生成文件(格式可以自定义)→下载文件_你挚爱的强哥的博客-CSDN博客。会自动创建一个html文件。https://blog.csdn.net/qq_37860634/art…

业务中添加历史版本事务并发处理

业务背景&#xff1a;项目中包含历史版本的管理&#xff0c;每次保存历史版本都添加一条新的记录到数据库&#xff0c;且版本号加1。保存版本的时候1.要先查询历史版本数据表&#xff0c;获取当前最新的版本号&#xff1b;2.最新的版本号加1&#xff0c;插入数据历史版本记录表…

dp算法 力扣174地下城游戏

在学习编程时&#xff0c;算法是一道硬菜&#xff0c;而dp作为算法的一份子&#xff0c;它的地位在编程界举足轻重。 174. 地下城游戏 - 力扣&#xff08;LeetCode&#xff09; 本文是Java代码哦~ 一、题目详情 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地…