Android---GC回收机制与分代回收策略

2023-10-04 17:46

本文主要是介绍Android---GC回收机制与分代回收策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

GC 回收机制

垃圾回收(Garbage Collection, GC)

垃圾回收算法

JVM 分代回收策略

1. 新生代

2. 老年代 

GC Log 分析

引用


GC 回收机制

垃圾回收(Garbage Collection, GC)

垃圾就是内存中已经没有用的对象,JVM 中的垃圾回收器(Garbage Collector)会自动回收,Java 虚拟中使用“可达性分析”算法来决定对象是否可以被回收。如下图:

以 GC Root 作为起始点, 从这些节点开始向下搜索,所走过的路径称为引用链,最后通过判断对象的引用链是否可达来决定对象是否可以被回收。例如,上图中对象 A, B, C, D, E 与 GC Root 之间都存在一条直接或间接的引用链,这也代表他们与 GC Root 之间是可达的,因此它们是不能被 GC 回收掉的。而对象 M, K 虽然被对象 J 引用到,但是并不存在一条引用链连接 GC Root,所以 GC 回收时,只要遍历到 J, K, M 这三个对象,就会将它们回收。

在 Java 中,有以下几种对象可以作为 GC Root

1. Java 虚拟机栈(局部变量表)中引用的对象;

2. 方法区中静态引用指向的对象;

3. 仍处于存活状态中的线程对象;

4. Native 方法中 JNI 引用的对象;

垃圾回收算法

1. 标记清除算法(Mark and Sweep GC)

从 “GC Roots” 集合开始,将内存整个遍历一次,保留所有可以被 GC Roots 直接或间接引用到的对象,而剩下的对象都当作垃圾并回收。

过程分两步:

\bullet Mark 标记阶段:找到内存中所有的 GC Root 对象,只要和 GC Root 直接或间接相连则标记为灰色(存活对象),否则标记为黑色(垃圾对象);

\bullet Sweep 清除阶段:遍历完所有的 GC Root 之后,则将标记为垃圾的对象直接删除。

优点:实现简单,不需要将对象进行移动;

缺点:需要中断进程内其它组件的执行(即,Stop the world),并且可能产生内存碎片,提高了垃圾回收的频率。 

2. 复制算法(Copying)

将现有的内存空间分为两块,每次只使用其中一块。在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块中的对象,交换两个内存的角色,完成垃圾回收。

优点:按顺序分配内存即可,实现简单、运行高效,不用考虑内存碎片;

缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制。

3. 标记-压缩算法(Mark-Compact)

需要先从根节点开始对所有可达对象做一次标记,之后并不简单的清除未标记的对象,而是将所有的存活对象压缩到内存的一端,最后清理边界外所有的空间。

过程分两步:

\bullet Mark 标记阶段:找到内存中所有的 GC Root 对象,只要和 GC Root 直接或间接相连则标记为灰色(存活对象),否则标记为黑色(垃圾对象);

\bullet Compact 压缩阶段:将剩余存活对象按顺序压缩到内存的某一端。

优点:即避免了碎片的产生,又不需要两块相同的内存空间,其性价比比较高;

缺点:所谓压缩操作,仍需要进行局部对象移动,一定程度上还是降低了效率。 

JVM 分代回收策略

Java 虚拟机根据对象存活的周期不同,把堆内存划分为新生代老年代,这就是 JVM 的内存分代策略。

1. 新生代

新生成的对象优先存放在新时代中,存活率很低。新生代中,常规的一次 GC  一般可以回收 70%~ 90% 的空间,回收率很高。所有,在新时代中采用的GC 回收算法是复制算法

新生代细分为3个部分:Eden, Survivor0(简称 S0), Survivor1(简称 S1),这三部分按照 8 : 1 : 1的比例来划分新生代。

2. 老年代 

一个对象如果在新生代存活了足够长的时间(15次 GC 后仍存活)而没有被清理掉,则会被复制到老年代。老年代的内存大小一般比新生代大,能存放更多的对象。如果对象比较大(如长字符串或者大数组),并且新生代的剩余空间不足,则这个大对象会直接被分配到老年代。可以使用 

-XX:PretenureSizeThreshold

来控制直接升入老年代的对象大小。因为对象的生命周期较长,不需要过多的复制操作,所以一般采用标记压缩的回收算法。

GC Log 分析

为了让上层应用开发人员更加方便的调试 Java 程序,JVM 提供了相应的 GC 日志。在 GC 执行垃圾回收事件的过程中,会有各种相应的 log 被打印出来。其中新生代和老年代所打印的日志是有区别的:

\bullet 新生代 GC:

这一区域的 GC 叫做 Minor GC。因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较块。

\bullet 老年代 GC:

发生在这一区域的 GC 也叫做 Major GC 或者 Full GC。当出现 Major GC,经常会伴随至少一次的 Minor GC。

引用

通过 GC Roots 的引用可达性来判断对象是否存活。

JVM 中的引用关系根据引用强度的由强到弱,可分为:

强引用(Strong Reference)

软引用(Soft Reference)

弱引用(Weak Reference)

虚引用(Phantom Reference)

这篇关于Android---GC回收机制与分代回收策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2443

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

离心萃取机废旧磷酸铁锂电池回收工艺流程

在废旧磷酸铁锂电池的回收工艺流程中,离心萃取机主要应用于萃取除杂的步骤,以提高回收过程中有价金属(如锂)的纯度。以下是结合离心萃取机应用的废旧磷酸铁锂电池回收工艺流程: 电池拆解与预处理 拆解:将废旧磷酸铁锂电池进行拆解,分离出电池壳、正负极片、隔膜等部分。破碎与筛分:将正负极片进行破碎处理,并通过筛分将不同粒径的物料分开,以便后续处理。 浸出与溶解 浸出:采用适当的浸出工艺(如二段式逆

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分