我的Android开发【分代收集算法】

news2024/11/13 9:30:02

为什么要采用分代收集算法?

  • 分代的垃圾回收策略,是基于这样⼀个事实:不同的对象的⽣命周期是不⼀样的。因此,不同⽣命周期的对象可以采取不同的收集⽅式,以便提⾼回收效率。
  • 在 Java 程序运⾏的过程中,会产⽣⼤量的对象,其中有些对象是与业务信息相关,⽐如 Http 请求中的 Session 对象、线程、Socket 连接,这类对象跟业务直接挂钩,因此⽣命周期⽐较⻓。但是还有⼀些对象,主要是程序运⾏过程中⽣成的临时变量,这些对象⽣命周期会⽐较短,⽐如:String 对象,由于其不变类的特性,系统会产⽣⼤量的这些对象,有些对象甚⾄只⽤⼀次即可回收。
  • 在不进⾏对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进⾏回收,花费时间相对会⻓,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于⽣命周期⻓的对象⽽⾔,这种遍历是没有效果的,因为可能进⾏了很多次遍历,但是他们依旧存在。因此,分代垃圾回收采⽤分治的思想,进⾏代的划分,把不同⽣命周期的对象放在不同代上,不同代上采⽤最适合它的垃圾回收⽅式进⾏回收。

分代收集理论

这个理论主要是建立在两个分代假说之上的:

  • 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。
  • 强分代假说(Stong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以死亡。

这两个部分共同奠定了后面很多的垃圾收集器的基本设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据年龄分配到不同的区域进行存储,针对不同的区域,又进行不同的垃圾收集。

但在最后也还出现了一个问题,在进行一次只限于新生代区域的收集(Minor GC),但新生代中的对象完全有可能被老年代所引用的,为了找出该区域中的存活对象,就不得不在固定的GC Roots之外,再额外遍历整个老年代所有对象来确保可达性结果的正确性,反过来也是一样的。这种在理论上是可行的,但实际上会对内存回收带来很大的性能负担。

所以就有了第三条经验法则:

  • 跨代引用假说(Intergenerational Reference Hypothesis):跨代引用相对于同代引用来说仅占极少数。 存在互相引用关系的两个对象,是一个倾向于同时生存或者同时消亡的。
  • 依据这条假说,我们就不再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在哪些跨代引用,只需要在新生代上建立一个全局的数据结构(记忆集),这个结构把老年代划分为若干个小块,标识出老年代的那一块内存会存在跨代引用。

当在这之后再发生Minor GC时,只有包含了跨代引用的小块内存里的对象才会被加入GC Roots中进行扫描。

分代收集算法

就目前来讲,业界各种商业虚拟机堆内存的垃圾收集,基本上都采用了分代收集。可想而知,分代收集算法有多么重要。分代收集算法的思想是:

根据对象的存活周期,把内存分成多个区域,不同区域使用不同的回收算法回收对象。

堆内存结构 Java 把堆分成了"新生代"和"老年代",我们来看下图:

经过分代之后,垃圾回收可以分成以下几类:

  • 新生代回收(Minor GC | Young GC)
  • 老年代回收(Major GC)
  • 清理整个堆(Full GC)

由于执行Major GC的时候,也会伴随着一次Minor GC,可以认为,Major GC ≈ Full GC

下面我们来看一下对象是怎么分配到堆内存的。 对象在创建的时候,会先存放到伊甸园。当伊甸园满了之后,就会触发垃圾回收。这个回收的过程是:把伊甸园中的对象拷贝到From survivor或者是To survivor里面去。

比如说,第一次回收把对象拷贝到From survior里了,那么下一次回收就会把存活的对象从From survior拷贝到To survior,再下一次就会把To survior里的对象拷贝到From surivor,周而复始。那么不难发现,这个过程使用了复制算法,这也就是为什么新生代要有两个survior的原因。

那么对象每经历一次垃圾回收之后,那么还存活的话,他的年龄就会加一。当对象的年龄达到阈值的话(默认是15),就会晋升到老年代,老年代里的对象存活率是比较高的。

老年代一般是采用标记清除或者标记整理的思想进行回收。

注意

这里需要说明一下,这里的过程只是一个典型的分配流程。实际情况是存在例外的:

新建的对象不一定会分配到伊甸园,也有可能直接分配到老年代 这里主要分为两种场景:

  • 对象大于-XX:PretenureSizeThreshold(默认是0),就会直接分配到老年代
  • 新生代空间不够 如果你的对象非常的大,比如是一个超大数组,新生代的空间根本不够,那么这个时候也会直接放到老年代。因为新生代采用的是复制算法,在伊甸园分配大对象的话将会导致伊甸园和两个survior区大量的内存拷贝。

对象不一定要达到年龄才进入老年代

  • 虚拟机有一个动态年龄的概念,如果Survior空间中所有相同年龄大小的总和大于Survivor空间的一半,那么年龄大于等于该年龄的对象就可以直接进老年代。

垃圾回收的触发条件

新生代(Minor GC)触发条件

伊甸园空间不足,就会进行Minor GC回收新生代

老年代(Full GC)触发条件

  • 老年代空间不足
  • 元空间不足
  • 要晋升老年代的对象所占用的空间大于老年代的剩余空间。
  • 显式调用System.gc()

建议垃圾回收器执行垃圾回收 -XX: +DisableExplicitGC 参数,忽略掉System.gc()的调用

上面的大概讲述了Android开发中的【理解分代收集算法】;有关更多的Android技术或者核心优化能力可参考《Android核心技术手册》点击即可进入。

总结

分代收集算法是根据对象的生命周期,把内存作分代,然后在分配对象的时候,不同生命周期的对象放在不同的代里面,不同的代上使用合适的回收算法进行回收,比方说,新生代里面的对象存活周期一般都比较短,每次垃圾回收的时候都会发现有大量的对象死去,所以新生代可以使用复制算法来完成垃圾收集。而老年代里的对象存活率比较高,所以就采用标记清除或者标记整理进行回收。

那么相比单纯的标记清除、标记整理、复制算法,分代带来了什么好处呢?

  • 分代可以更有效的清除不需要的对象。
  • 提升了垃圾回收的效率

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

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

相关文章

【大数据基础】vmware+ununtu安装详细过程

环境配置 1. 虚拟机VMware下载与安装 首先安装vmware workstation 密钥直接利用科技生成。 检查vmware是否成功安装 2. VMware安装Ubuntu18.04 LTS 在清华源镜像站找到合适版本的ubuntu 联网安装需要一些时间,大致在一到两个小…

NetSuite Balancing Segment平衡段

春节假期偷了一段时间懒,现在开始工作了。今朝谈一个偏门题目,于未知领域再下一城。说这个题目偏,就要讲讲渊源。话说在Oracle的EBS和Fusion产品中的COA领域有个功能叫做“Balancing Segment”。 问了几位Oracle老炮,也说是对第二…

RDS-MySQL算不算国产数据库及其风险问题

作者:IT圈黎俊杰 笔者在参与国内某大型央企信创替代研究工作中,遇到从各方面传来的“云平台上的RDS就是国产数据库,使用RDS替代原数据库,也是信创替代”的说法,当说的人多了,产生的误导性强了以后&#xff…

Qt OpenGL(三十八)——Qt OpenGL 核心模式-绘制彩色的点

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十八)——Qt OpenGL 核心模式-绘制彩色的点 一、场景 续接上一篇文章(动态刷新点云),动态刷新点云数据,如下图: 如果,我们需要的点的绘制是彩…

数据挖掘学习笔记——GEO数据库:芯片数据分析

数据挖掘 数据挖掘学习笔记——GEO数据库:芯片数据分析 文章目录数据挖掘一、芯片基础知识1.1、背景二、GEO数据库概述2.1、基础简介2.2、检索页面展示三、GSE项目的三种下载方式3.1、主页下载原始数据3.2、主页下载表达矩阵3.3、GEOquery包下载表达量四、基因名与…

AI与制造的联合与突破,捷配是作何选择的?

最近的chatGPT可谓是火遍全球,人工智能与AI的话题再一次被推上了各大平台热搜,各个行业、各路专家也大谈对各个行业的影响。那么PCB制造业中,AI意味着什么?某一天,在生产工厂中,看着每一条生产链条持续运行…

一文教你学会添加通达信外挂接口(财经外挂)

今天重点讲解怎样在您的股票交易软件里增加财经类外挂,对您的股票交易软件进行便利化的设置与完善,把您想看的内容统统加紧你的交易软件,方便以后的研究操作。 具体流程是这样的:打开您要添加的财经网站官网,复制官网…

第四章 模块和组件、模块化和组件化的理解

1、模块 理解:向外提供特定功能的js程序,一般就是一个js文件为什么要拆成模块:随着业务逻辑增加,代码越来越多且复杂作用:复用js,简化js的编写,提高js运行效率 我们以一段代码举例说明拆分模块…

C#WPF基础教程3——资源字典、样式、

资源字典 创建资源字典 创建合并资源属性 资源字典的使用 引用类库中的资源字典 在类库中创建资源字典 类库中资源字典的使用 样式 添加样式 使用静态的方式为按钮添加样式 设置背景样式,不能直接使用value 关联事件处理程序 UI层创建事件关联程序 model端创建…

每日学术速递2.13

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV、cs.AI、cs.CL 1.Deep Intra-Image Contrastive Learning for Weakly Supervised One-Step Person Search 标题:深度图像内对比学习用于弱监督的单步人物搜索 作者&#…

模型解释性:SHAP包的使用

本篇博客介绍另一种事后可解释性方法:SHAP(SHapley Additive exPlanation)方法。 1. Shapley值理论 Shapley值是博弈论中的一个概念,通过衡量联盟中各成员对联盟总目标的贡献程度,从而根据贡献程度来进行联盟成员的利益分配,避免…

机器学习-特征工程

特征工程是将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性。特征抽取文本特征抽取,sklearn的API是sklearn.feature_extraction.text.CountVectorizer。(1).英文分词from sklearn.fe…

Smart Finance 热启动创世开启,参与质押瓜分SMART资产

在2023年开年以来,加密市场开始迎来复苏,以BTC、ETH等为代表的主流加密资产迎来普涨,虽然相较于2021年顶峰时期相比仍存在一定的差距,但市场的回暖正在带动加密行业在2023年的复苏。而随着DigiDaigaku登录美国体育盛会“超级碗”&…

手把手教你抢BingChatGPT免费体验名额!

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :ChatGPT-Bing 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永…

关于docker在CentOS6与CentOS7的安装教程

CentOS 6 安装docker步骤yum install -y epel-releaseyum install -y docker-io安装后的配置文件:/etc/sysconfig/docker启动Docker后台服务:service docker startdocker version验证CentOS 7 安装docker步骤感兴趣的可以看看docker安装文档https://docs…

企业如何解决内容审核的安全风险?

内容审核是什么?随着互联网的快速发展,与之而来的是信息爆炸式增长,而且这些互联网信息良莠不齐,其发布者也鱼龙混杂,常常混入很多不良或者违规违法信息,例如涉政、涉黄、暴恐、违禁、不良价值观、广告等。…

使用FirewallD构建动态防火墙(9)

预备知识 firewalld 是新一 Linux 代防火墙工具,它提供了支持网络 / 防火墙区域 (zone) 定义网络链接以及接口安全等级的动态防火墙管理工具。它也支持允许服务或者应用程序直接添加防火墙规则的接口。在 Linux 历史上已经使用过的防火墙工具包括:ipfwa…

redis命令大量超时 连接数突增

大家好,我是烤鸭: 今天分享一个线上线上redis命令大量超时,连接数突增的问题。由于不是我这边的业务,只能根据事后的一些客观数据进行分析。 配置: ​ redis 4.0 3主3从,总内存36G。 ​ 业务服务7台…

跨平台代码编写工具 Visual Studio Code

随着生产力的提高,生产工具也在不断的提高。 今天就介绍 目前最好用的工具 Visual Studio Code。 1. 入门 Visual Studio Code 是一款轻量级但功能强大的源代码编辑器,可在您的桌面上运行,适用于 Windows、macOS 和 Linux。它内置了对 Java…

蓝库云|制造业转型不可或缺的“PLM”的作用和真正价值

PLM是产品生命周期管理,是一种应用于在单一地点的企业内部、分散在多个地点的企业内部,以及在产品研发领域具有协作关系的企业之间的,支持产品全生命周期的信息的创建、管理、分发和应用的一系列应用解决方案,它能够集成与产品相关…