Android中JVM内存回收机制

文章目录

    • 分代收集算法:
      • 新生代(Young Generation)
      • 老年代(Old Generation)
    • 垃圾回收器:
    • JVM常见三大回收算法:
      • Mark-Sweep(标记清除)
        • 优点:
        • 缺点:
      • 复制算法
        • 优点:
        • 缺点:
      • Mark-Compact(标记压缩)
        • 优点:
        • 缺点:
    • 四种引用类型:

分代收集算法:

新生代(Young Generation)

回收时先将 Eden 区存活对象复制到一个 Survivor0 区,然后清空 Eden 区,当这个 Survivor0 区也存放满了时,则将 Eden 区和 Survivor0 区存活对象复制到另一个 Survivor1 区,然后清空 Eden 和这个 Survivor0 区,此时 Survivor0 区是空的,然后将 Survivor0 区和 Survivor1 区交换,即保持 Survivor1 区为空, 如此往复。当 Survivor1 区不足以存放 Eden 和 Survivor0 的存活对象时,就将存活对象直接存放到老年代。当对象在 Survivor 区躲过一次 GC 的话,其对象年龄便会加 1,默认情况下,如果对象年龄达到 15 岁,就会移动到老年代中。若是老年代也满了就会触发一次 Full GC,也就是新生代、老年代都进行回收。

老年代(Old Generation)

老年代(Old Generation):在新生代中经历了 N 次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。内存比新生代也大很多(大概比例是 1:2),当老年代内存满时触发 Major GC 即 Full GC,Full GC 发生频率比较低,老年代对象存活时间比较长,存活率高。一般来说,大对象会被直接分配到老年代。所谓的大对象是指需要大量连续存储空间的对象,最常见的一种大对象就是大数组。当然分配的规则并不是百分之百固定的,这要取决于当前使用的是哪种垃圾收集器组合和 JVM 的相关参数。

垃圾回收器:

在这里插入图片描述

  • 新生代可以适用的垃圾回收器:Serial(串行收集器)、ParNew(并行年轻代收集器)、Parallel Scavenge(并行回收器)
  • 老年代可以适用的垃圾回收器:CMS(并发标记-清除收集器)、Serial Old(串行老年代收集器)、ParallelOld(并行老年代收集器)
  • G1(Garbage First 收集器)和 ZGC(Z Garbage Collector)回收器适用于新生代和老年代混合回收
  • 相互之间有连线的表示可以配合使用,常用组合:Serial+Serial Old, Parallel Scavenge+Parallel
    Old,ParNew+CMS,G1(不需要组合其他收集器)

名词解释:

  • 并行回收(Parallel):多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态
  • 串行回收:单个垃圾收集线程工作
  • Minor GC(Young GC):发生在年轻代的GC
  • Full GC:发生在老年代的GC,full GC回收速度一般比Minor GC慢10倍左右,JVM调优也是主要针对Full GC进行调优

JVM常见三大回收算法:

Mark-Sweep(标记清除)

在这里插入图片描述

优点:

比较简单

缺点:

容易碎片化(内存空间不连续)

复制算法

在这里插入图片描述

优点:

效率非常高,速度非常快,因为操作系统对于管理内存来说,清除一块连续的内存效率很高,速度很快

缺点:

浪费空间

Mark-Compact(标记压缩)

在这里插入图片描述

优点:

不会产生碎片

缺点:

效率低

四种引用类型:

  1. 强引用(Strong Reference)

它是最常见的引用类型。当一个对象被一个强引用引用时,即使内存不足时,垃圾回收器也不会回收该对象。只有当该对象的所有强引用都被解除后,垃圾回收器才会回收该对象。强引用的应用场景通常是在对象的生命周期内都需要引用该对象的情况。

  1. 软引用(Soft Reference)

当一个对象如果只有软引用,只有当系统内存不足时,垃圾回收器才会回收该对象。软引用通常用来实现缓存或者高速缓存,当内存不足时可以释放一些缓存的对象。

  1. 弱引用(Weak Reference)

在面试过程中,很多面试者经常会将弱引用和软引用这两者搞混,其实从名字上可以看出,弱引用是比软引用更弱的一种引用类型,当垃圾回收器扫描到只具有弱引用的对象时,无论当前内存是否不足,都会对弱引用对象进行回收。

  1. 虚引用(Phantom Reference)

虚引用并不会对所指向的对象生命周期产生任何影响,也就是对象还是会按照它原来的方式被垃圾回收器回收,虚引用本质上只是一个标记作用,用来跟踪对象被垃圾回收的活动。

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

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

相关文章

ubuntu下交叉编译安卓FFmpeg 和 官方指导链接

将之前的编译方法在此记录 Linux系统:Ubuntu 18.04.6 LTS 交叉编译工具链:gcc-aarch64-linux-gnu gaarch64-linux-gnu ffmpeg版本:5.1.3 1.下载源码 ffmpeg官网:https://ffmpeg.org/download.html#releases 下载完成后&#x…

Edge浏览器“此页存在问题”解决思路

Edge浏览器显示“此页存在问题”解决思路 大家平时使用Edge浏览器时,是否和我一样会突然出现“此页存在问题”的情况? 经过百度查询后我找了一种情况和解决办法,能够大大减少这类问题的出现。出现“此页存在问题”可能是因为之前使用过软件…

Linux基础命令[27]-gpasswd

文章目录 1. gpasswd 命令说明2. gpasswd 命令语法3. gpasswd 命令示例3.1 不加参数3.2 -a(将用户加入组)3.3 -d(从组中删除用户)3.4 -r(删除组密码)3.5 -M(多个用户一起加入组)3.6 …

React中 将UI 视为树

当 React 应用程序逐渐成形时,许多组件会出现嵌套。那么 React 是如何跟踪应用程序组件结构的? React 以及许多其他 UI 库,将 UI 建模为树。将应用程序视为树对于理解组件之间的关系以及调试性能和状态管理等未来将会遇到的一些概念非常有用。…

Python教程:使用Python和PyQt编写进制转换器工具

1.介绍 在现代计算中,进制转换是一项常见且重要的任务。为了简化这个过程,我们也可以利用Python和PyQt自己写一个直观且易于使用的进制转换器工具。这个工具将支持二进制、八进制、十进制和十六进制的相互转换,并提供良好的用户界面和交互体…

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:…

MySQL---函数与约束

目录 一、函数 1. 字符串函数 2. 数值函数 3. 日期函数 4. 流程函数 5. 总结 二、约束 1. 概述 2. 约束演示 3. 外键约束 3.1 添加外键 3.2 删除外键 3.3 外键删除更新行为 4. 总结 一、函数 1. 字符串函数 命令如下所示: -- concat select concat("Hel…

苹果CMS:如何去掉首页帮助提示信息

首先我们安装好苹果CMS,未安装的可以参考苹果cms:介绍及安装 安装好之后我们需要进入模版设置,可能对于刚刚接触CMS框架的朋友是不清楚地址的: https://www.yourweb.com/admin_login.php/admin/mxpro/mxproset 其中【yourweb】…

爱设计AiPPT.cn赵充:营销工作的AI进化

爱设计&AiPPT.cn是一家 AIGC 数字科技企业,致力于打造「下一代个人与组织的 Ai 工作站」 。目前旗下产品包括AiPPT.cn、爱设计AIGC 内容中台、365 编辑器、爱设计在线设计工具、AiH5 等超过 10 余款应用 AI 能力的内容创作工具。日前,爱设计&AiP…

python的协程异步

参考资料 https://blog.csdn.net/qq_43380180/article/details/111573642?spm1001.2014.3001.5506 协程的概念 指的是在一个线程中,可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。协程不是进程,也不是线程。 进程 VS 线程…

TypeScript-类型断言

类型断言 当开发者比TS本身更清楚当前的类型是什么,可以使用断言(as)让类型更加精确和具体 const _link document.getElementById(link) console.log(_link.href) // 出错了,如下图 const _link document.getElementById(link) as HTMLAnchorElement…

【三数之和】python,排序+双指针

暴力搜索3次方的时间复杂度,大抵超时 遇到不会先排序 排序双指针 上题解 照做 class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:res[]nlen(nums)#排序降低复杂度nums.sort()k0#留两个位置给双指针i,jfor k in range(n-2):if nums[k]…

【再探】Java—泛型

Java 泛型本质是参数化类型,可以用在类、接口和方法的创建中。 1 “擦除式”泛型 Java的“擦除式”的泛型实现一直受到开发者的诟病。 “擦除式”的实现几乎只需要在Javac编译器上做出改进即可,不要改动字节码、虚拟机,也保证了以前没有使…

光伏电站在线监测智能诊断系统:开启无人值守新纪元

光伏电站在线监测智能诊断系统:开启无人值守新纪元 大家都知道光伏电站是通过汲取着太阳的光芒,为人类提供源源不断的电能源。然而,随着光伏电站规模的扩大和复杂性的增加,如何有效提高发电效率、减少人工维护成本,实…

YOLOV5算法多目标检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着计算机视觉技术的飞速发展,目标检测已成为许多实际应用场景中的关键技术&…

数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记…

电脑卸载linux安装windows后每次开机都出现grub

原因分析 这是因为电脑硬盘中还存在linux系统的引导程序,并且启动顺序还在windows之前,有时候通过bios根本找不到它的存在,以至于每次windows开机出现grub之后都要输入exit退出linux的引导之后才能使得电脑进入windows,这个有时会…

Python | Leetcode Python题解之第108题将有序数组转换为二叉搜索树

题目: 题解: class Solution:def sortedArrayToBST(self, nums: List[int]) -> TreeNode:def helper(left, right):if left > right:return None# 选择任意一个中间位置数字作为根节点mid (left right randint(0, 1)) // 2root TreeNode(nums…

纯血鸿蒙APP实战开发——边缓存边播放案例

介绍 OhosVideoCache是一个支持边播放边缓存的库,只需要将音视频的url传递给OhosVideoCache处理之后再设置给播放器, OhosVideoCache就可以一边下载音视频数据并保存在本地,一边读取本地缓存返回给播放器,使用者无需进行其他操作…

NDIS小端口驱动(五)

在需要的时候,我们也许需要NDIS微型端口程序信息,下面会从多个方面来讨论如何查询NDIS微型端口驱动。 查询无连接微型端口驱动程序 若要查询无连接微型端口驱动程序维护的 OID,绑定协议调用 NdisOidRequest 并传递 一个NDIS_OID_REQUEST 结…