【Android GC】垃圾回收

Android-GC原理探究(深度好文) 所以当我们尝试手动去生成一些几百K的对象,试图去扩大可用堆大小的时候,反而会导致频繁的GC,因为这些对象的分配会导致GC,而GC后会让堆内存回到合适的比例,而我们使用的局部变量很快会被回收理论上存活对象还是那么多,我们的堆大小也会缩减回来无法达到扩充的目的。这样既能减少拷贝操作,还能减少对内存的需求。主流的大部分Davik采取的都是标注与清理(Mark and Sweep)回收算法,也有实现了拷贝GC的,这一点和HotSpot是不一样的,具体使用什么算法是在编译期决定的,无法在运行的时候动态更换。 阅读详情

前言

垃圾回收一般需要暂停所有线程的执行,叫stop-the-world。GC优化基本就是减少暂停次数和暂停时间。

一、回收哪里的垃圾

JVM的内存大致分为5个区,程序计数器,虚拟机栈,本地方法栈,堆,方法区。

程序计数器

顾名思义跟PC寄存器作用类似,每个线程独立存在,生命周期与线程一致。指示当前执行的方法,内存很小,忽略不计,没有垃圾。

虚拟机栈

栈空间,每个线程独立存在,保存方法参数或者方法内对象的引用。生命周期结束,比如方法执行完毕后内存会被释放,所以不需要垃圾管理。

本地方法栈

与虚拟机栈类似,对应native方法。不需要垃圾管理。

堆

对象的实际存储区域,比如在方法内new一个局部变量,在堆开辟内存,引用保存在虚拟机栈。也是垃圾管理的最主要的区域。

方法区

class文件和常量(JDK7开始字符串常量池在堆区)存储区域,属于垃圾管理范围。

二、确定哪些是垃圾

主要有两个算法,引用计数法,可达性分析法(根搜索算法)。基本所有垃圾回收器都采用可达性分析法。

引用计数法

记录每个引用的被引用个数,当引用个数为0时代表成为垃圾,应该被清理。
优点:

  1. 实现简单
  2. 引用减少至0时,实时回收内存,内存利用率高
  3. 回收操作可并发运行,无需暂停应用线程

缺点:
4. 无法解决环状引用,如a引用b,b引用a。两个都是垃圾却不会被清理(过于致命)
5. Space overhead: 每个对象需要格外空间存储引用次数
6. Speed overhead: 每次引用修改需要增加指令,且多线程情况下需要加锁保证原子操作

可达性分析法(根搜索算法)

确定根对象(GC ROOT),顺着根对象遍历,凡是被根对象直接或者间接引用的都不是垃圾,剩下就是垃圾。 Java中的GC ROOT对象有: 7. 虚拟机栈中引用的对象(本地变量表) 8. 方法区中静态属性引用的对象 9. 方法区中常量引用的对象 10. 本地方法栈中引用的对象(Native对象)

算法优点: 11. 不存在循环引用问题 12. 不存在引用计数法的空间和运行时开销

算法缺点: 13. 内存利用率低(在GC回收内存前,垃圾对象占用的内存无法复用 14. 设计复杂,若需要支持并发回收需要额外数据结构支撑 15. PauseTime: 根集枚举与引用Tracing过程一般需要暂停应用线程至少一次,大部分回收器要暂停2-3次

三、怎么回收垃圾

分代回收

新生代(Young generation):绝大多数最新被创建的对象都会被分配到这里,由于大部分在创建后很快变得不可达,很多对象被创建在新生代,然后“消失”。对象从这个区域“消失”的过程我们称之为:Minor GC 。 新生代又可以细分为Eden,survivor0,survivor1三个空间。默认比例8:1:1。

老年代(Old generation):

  1. 对象比较大,分配时直接分配在老年代。
  2. 多次(默认15)从新生代周期中存活了下来,会被拷贝到老年代。
  3. 动态对象年龄判定。

如果在Survivor区中从低年龄开始累计所有对象大小的总和大于Survivor区空间的一半时,那么年龄大于等于临界年龄的对象就可以直接进入老年代。
4. 空间分配担保。
JDK 6 Update 24之前:在年轻代发生Minor GC前,虚拟机检查老年代最大可用连续空间是否大于新生代所有对象总空间,若大于,那这次Minor GC可以确保安全。若不成立,则虚拟机根据—XX:HandlePromotionFailure参数设定值是否允许担保失败,若允许,则检查是否大于历次晋升到老年代对象的平均大小,如果大于,则进行Minor GC(有风险,可能老年代空间不足分配新生代中的对象而被迫Full GC),如果小于或者设定不允许,那改为进行一次Full GC。
JDK 6 Update 24之后:XX:HandlePromotionFailure有这个参数,但不起作用,规则是只要老年代最大可用连续空间大于新生代所有对象总空间或者历次晋升的平均大小,就会Minor GC,否则Full GC

老年代区域分配的空间要比新生代多。也正由于其相对大的空间,发生在老年代的GC次数要比新生代少得多。对象从老年代中消失的过程,称之为:Major GC 或者 Full GC。

持久代(Permanent generation) 也称之为 方法区(Method area):用于保存类常量以及字符串常量。注意,这个区域不是用于存储那些从老年代存活下来的对象,这个区域也可能发生GC。发生在这个区域的GC事件也被算为 Major GC 。只不过在这个区域发生GC的条件非常严苛,必须符合以下三种条件才会被回收: 1、所有实例被回收 2、加载该类的ClassLoader 被回收 3、Class 对象无法通过任何途径访问(包括反射)

标记清除算法

确定垃圾后直接回收清除。优点是实现简单,GC耗时短。缺点是产生大量内存碎片。示意图如下。

标记复制算法

分两个空间,一个活动,一个空闲。确定活动空间中的存活对象,全部复制到空闲空间,活动空间全部回收。然后两者角色互换,活动变空闲,空闲变活动。 优点是没有内存碎片问题,缺点是一半的空间浪费(新生代中Eden始终作为活动空间,survivor0,survivor1每次垃圾回收后互换角色。所以实际只有十分之一的空间浪费)和复制对象的开销。示意图如下。

标记压缩算法

标记存活对象,然后将存活对象往一个方向(左端)复制整理。这样剩下的空间就是连续的。优点同样是没有内存碎片问题。和标记复制算法相比没有空间浪费,但是对象整理相比直接复制时间开销更大。示意图如下。

四、主要垃圾回收器

上面是垃圾回收主要涉及的算法或者说思想,下面是各个企业或者说项目的具体实现。

Serial

一个串行收集器。

Serial收集器是Java虚拟机中最基本、历史最悠久的收集器。在JDK1.3之前是Java虚拟机新生代收集器的唯一选择。目前也是ClientVM下ServerVM 4核4GB以下机器默认垃圾回收器。Serial收集器并不是只能使用一个CPU进行收集,而是当JVM需要进行垃圾回收的时候,需暂停所有的用户线程,直到回收结束。 使用算法:标记复制算法

SerialOld

SerialOld是Serial收集器的老年代收集器版本,它同样是一个单线程收集器,这个收集器目前主要用于Client模式下使用。如果在Server模式下,它主要还有两大用途:一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,另外一个就是作为CMS收集器的后备预案,如果CMS出现Concurrent Mode Failure,则SerialOld将作为后备收集器。

使用算法:标记 - 整理算法

ParNew

ParNew其实就是Serial收集器的多线程版本。除了Serial收集器外,只有它能与CMS收集器配合工作。ParNew是许多运行在Server模式下的JVM首选的新生代收集器。但是在单CPU的情况下,它的效率远远低于Serial收集器。

使用算法:标记复制算法

ParallelScavenge

ParallelScavenge又被称为吞吐量优先收集器,和ParNew 收集器类似,是一个新生代收集器。

使用算法:复制算法

ParallelOld

ParallelOld是并行收集器,和SerialOld一样,ParallelOld是一个老年代收集器,是老年代吞吐量优先的一个收集器。这个收集器在JDK1.6之后才开始提供的,在此之前,ParallelScavenge只能选择SerialOld来作为其老年代的收集器,这严重拖累了ParallelScavenge整体的速度。而ParallelOld的出现后,“吞吐量优先”收集器才名副其实。 使用算法:标记 - 整理算法

CMS (Android4.4到Android8的默认收集器)

一个老年代收集器,全称 Concurrent Low Pause Collector(也有说Concurrent Mark Sweep),是JDK1.4后期开始引用的新GC收集器,在JDK1.5、1.6中得到了进一步的改进。它是对于响应时间的重要性需求大于吞吐量要求的收集器。对于要求服务器响应速度高的情况下,使用CMS非常合适。

CMS的一大特点,就是用两次短暂的暂停来代替串行或并行标记整理算法时候的长暂停。 使用算法:标记 - 清理

CMS的执行过程如下:

· 初始标记(STW initial mark)
在这个阶段,需要虚拟机停顿正在执行的应用线程,官方的叫法STW(Stop Tow World)。这个过程从根对象扫描直接关联的对象,并作标记。这个过程会很快的完成。
· 并发标记(Concurrent marking)
这个阶段紧随初始标记阶段,在“初始标记”的基础上继续向下追溯标记。注意这里是并发标记,表示用户线程可以和GC线程一起并发执行,这个阶段不会暂停用户的线程哦。
· 并发预清理(Concurrent precleaning)
这个阶段任然是并发的,JVM查找正在执行“并发标记”阶段时候进入老年代的对象(可能这时会有对象从新生代晋升到老年代,或被分配到老年代)。通过重新扫描,减少在一个阶段“重新标记”的工作,因为下一阶段会STW。
· 重新标记(STW remark)
这个阶段会再次暂停正在执行的应用线程,重新重根对象开始查找并标记并发阶段遗漏的对象(在并发标记阶段结束后对象状态的更新导致),并处理对象关联。这一次耗时会比“初始标记”更长,并且这个阶段可以并行标记。
· 并发清理(Concurrent sweeping)
这个阶段是并发的,应用线程和GC清除线程可以一起并发执行。
· 并发重置(Concurrent reset)
这个阶段任然是并发的,重置CMS收集器的数据结构,等待下一次垃圾回收。
CMS的缺点: 1、内存碎片。由于使用了 标记-清理 算法,导致内存空间中会产生内存碎片。不过CMS收集器做了一些小的优化,就是把未分配的空间汇总成一个列表,当有JVM需要分配内存空间的时候,会搜索这个列表找到符合条件的空间来存储这个对象。但是内存碎片的问题依然存在,如果一个对象需要3块连续的空间来存储,因为内存碎片的原因,寻找不到这样的空间,就会导致Full GC。
2、需要更多的CPU资源。由于使用了并发处理,很多情况下都是GC线程和应用线程并发执行的,这样就需要占用更多的CPU资源,也是牺牲了一定吞吐量的原因。
3、需要更大的堆空间。因为CMS标记阶段应用程序的线程还是执行的,那么就会有堆空间继续分配的问题,为了保障CMS在回收堆空间之前还有空间分配给新加入的对象,必须预留一部分空间。CMS默认在老年代空间使用68%时候启动垃圾回收。可以通过-XX:CMSinitiatingOccupancyFraction=n来设置这个阀值。

CMS 在Android的应用中,当对象分配因碎片而失败或者应用进入后台后会执行压缩,解决内存碎片问题。

粘性CMS(sticky-CMS)

sticky-CMS是ART的不移动分代垃圾回收器。它仅扫描堆中自上次GC后修改的部分,并且只能回收自上次GC后分配的对象。

CC(Concurrent Copying)

Android8开始默认垃圾收集器

CC 支持使用名为“RegionTLAB”的触碰指针分配器。此分配器可以向每个应用线程分配一个线程本地分配缓冲区 (TLAB),这样,应用线程只需触碰“栈顶”指针,而无需任何同步操作,即可从其 TLAB 中将对象分配出去。

CC 通过在不暂停应用线程的情况下并发复制对象来执行堆碎片整理。这是在读取屏障的帮助下实现的,读取屏障会拦截来自堆的引用读取,无需应用开发者进行任何干预。 GC 只有一次很短的暂停,对于堆大小而言,该次暂停在时间上是一个常量。 在 Android 10 及更高版本中,CC 会扩展为分代 GC。它支持轻松回收存留期较短的对象,这类对象通常很快便会无法访问。这有助于提高 GC 吞吐量,并显著延迟执行全堆 GC 的需要。

GarbageFirst(G1)

JDK1.7引入,1.9成为默认收集器

G1是面向服务器的一款垃圾收集器,主要针对于多核处理器的大内存机器,可以满足gc的停顿时间且保证吞吐量,一般8g以上推荐使用G1,G1抛弃了之前堆中严格的分代内存划分.G1对堆模型的处理转换成了如下图方式,将整个堆内存划分成一个个小的独立区域(Region),JVM最多可以有2048个Region,也可以用参数-XX:G1HeapRegionSize指定Region的大小,一般不推荐指定,虽然G1依然有分代内存划分,但抛弃了连续的分代,他们可以是一些不连续的Region集合,正因为这样,每一个Region区域的功能会发生变化,比如一个Region之前按是年轻代,在做完垃圾回收之后又变成了老年代。 整体采用标记-整理算法,局部是通过是通过复制算法

ZGC

最新的垃圾收集器。JDK11引入(实验性质),JDK15转正。 设计目标: 最大停顿时间不超过10ms:之所以能控制在10ms以下,是因为它的停顿时间主要跟Root扫描有关,而跟root数量和堆的大小没有关系。 最坏的情况下吞吐量相比G1会下降15%

最后

在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。

**如果你觉得自己学习效率低,缺乏正确的指导,可以扫码,加入我们资源丰富,学习氛围浓厚的技术圈一起学习交流吧!

Android GC原理探究(深度好文),android开发软件安装JAVA路径 Starting Size : Dalvik虚拟机启动的时候,会先分配一块初始的堆内存给虚拟机使用。 Growth Limit:是系统给每一个程序的最大堆上限,超过这个上限,程序就会OOM Maximum Size:不受控情况下的最大堆内存大小,起始就是我们在用largeheap属性的时候,可以从系统获取的最大堆大小 同时除了上面的这个三个指标外,还有几个指标也是值得我们关注的,那就是堆最小空闲值(Min Free)、堆最大空闲值(Max Free)和堆目标利用率(Target Utilization)。假 阅读详情

相关推荐

RK3588 C-PHY摄像头驱动升级踩坑记:从‘Only CSI2 supported’报错到成功取流

本文详细记录了在RK3588平台上调试C-PHY摄像头驱动的全过程,从‘Only CSI2 supported’报错分析到成功取流。内容涵盖C-PHY与CSI-2协议差异、SDK版本对比、V4L2框架下的bus-type解析机制,以及硬件排查与寄存器调优实战经验,为嵌入式Camera驱动工程师提供宝贵参考。

weixin_42522374的博客 125

Android GC(垃圾回收)总结

文章目录前言一、回收哪里的垃圾程序计数器虚拟机栈本地方法栈堆方法区二、确定哪些是垃圾引用计数法可达性分析法(根搜索算法)三、怎么回收垃圾分代回收标记清除算法标记复制算法标记压缩算法四、主要垃圾回收器五、参考博文 前言 垃圾回收一般需要暂停所有线程的执行,叫stop-the-world。GC优化基本就是减少暂停次数和暂停时间。 一、回收哪里的垃圾 JVM的内存大致分为5个区,程序计数器,虚拟机栈,本地方法栈,堆,方法区。 程序计数器 顾名思义跟PC寄存器作用类似,每个线程独立存在,生命周期与线程一致。指示当前

Welcome_Word的博客 9107

陆地观测卫星数据服务平台深度体验:高分、中巴、资源系列影像的检索与下载技巧

本文深度解析国产陆地观测卫星数据服务平台的使用技巧,重点介绍高分、中巴、资源系列卫星影像的检索与下载方法。通过权限体系解析、高级检索策略、数据预处理等实战技巧,帮助用户高效获取高质量遥感数据,适用于环境监测、资源调查等多种应用场景。

eee77的博客 981

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

GC 回收机制垃圾就是内存中已经没有用的对象,JVM 中的垃圾回收器(Garbage Collector)会自动回收,Java 虚拟中使用“”算法来决定对象是否可以被回收。如下图:以 GC Root 作为起始点, 从这些节点开始向下搜索,所走过的路径称为引用链,最后通过判断对象的引用链是否可达来决定对象是否可以被回收。例如,上图中对象 A, B, C, D, E 与 GC Root 之间都存在一条直接或间接的引用链,这也代表他们与 GC Root 之间是可达的,因此它们是不能被 GC 回收掉的。

qq_44950283的博客 2377

【硬件开发】振铃

如果是开关管的振铃,那么桥臂的SW处产生的振铃会窜入驱动电路,造成的结果就是驱动电路和上桥臂下桥臂之间的SW节点都会有振铃现象。如果是驱动电路的振铃,那么MCU的输出引脚还是正常的PWM,但是到了MOS管两侧就变成带有振铃的PWM波形了。开关振铃产生的原因是MOS管上面的寄生电感当开关管打开时为了保持电流不变感应出的电压会对电源和地产生冲击。开关管的驱动线上的寄生电容和寄生电感导致的振铃为驱动电路振铃。开关管上的寄生电容和寄生电感导致的振铃为开关节点振铃。、电感等元件的存在,导致电路中的电压和。

weixin_62546664的博客 1829

BUUCTF--[OGeek2019]babyrop

才学习了基本的ROP流程,到处找题练,不过也没做出来几道题,以这道32位的题作为例题吧。 这道题是BUUCTF上pwn练习题里的[OGeek2019]babyrop。 代码审计 老规矩先checksec一下: 没有canary保护,nx保护开启排除shellcode可能性,FULL RELEO为地址随机化。 观察主函数,先设定了一个闹铃,到时间就会强制退出程序,解除闹铃的方法在上一篇博客中提到过了, 这道题中闹铃函数依然对我们解题起不到什么干扰作用。 主函数的思路大概是:生成一个随机数,把这个随机数作为

N1rvana的博客 6009

android 强制垃圾回收,Android垃圾回收(GC)

何为GCGC是garbage collection的缩写,垃圾回收的意思,也可以叫Garbage Collector,也就是垃圾回收器垃圾回收器的职责分配内存确保任何被引用的对象保留在内存中回收不能通过引用关系找到的对象的内存GC回收算法1. 标记回收算法(Mark and Sweep GC)从"GC Roots"集合开始,将内存整个遍历一次,保留所有可以被GC Roots直接或间接引用到的对象,...

weixin_42500684的博客 1637

Android 的端智能学习路径

基础层:先补齐 Android 进阶(JNI / 性能优化)和 AI 基础概念,无需深入算法开发;核心层:掌握 TFLite 的模型加载、推理、量化,能完成基础端侧推理;落地层:聚焦实战场景(图像 / OCR / 语音),解决工程化问题(模型管理、异常处理);优化层:通过模型量化、硬件加速、工程优化,提升推理性能和用户体验。

hqiangtai的博客 346

Android gc垃圾回收研究学习

JVM内存模型 JVM分别对新生代和旧生代采用的两种垃圾回收机制 如何判断对象是否可以被回收 gc的原因(Log释义)

做一个有思想的人 9841

解决Linux下Questasim中代码字体非常小

Questasim的source窗口里代码字体非常小 你是不是也遇到这样的问题,在使用Vmware时,Questasim的代码字体非常小,小到完全看不见,连断点都没办法标记。 下面我给出我摸索好久的解决办法,分享给大家。 1.首先,版本是Questasim 10.7c,在Vmware16中打开,情况如下: 不多逼逼,直接上图开搞: 给textFontV2设置值:monospace 12 normal roman 这里一定要注意啦,点完apply之后,不要点ok,直接关闭窗口。 ...

SummerXRT的博客 7817

TensorFlow2深度学习实战(十四):目标检测算法 YOLOv4 解析

最易上手的【计算机视觉】小白教程!

不积跬步,无以至千里! 7636

从Android程序员的角度理解JVM之垃圾回收(GC)

       从Android程序员的角度理解JVM垃圾回收(GC)

IT先森 1437

AEJoy —— 表达式之仅限在某一维摆动【JS】

效果图 wiggle() 的作用仅限于水平方向 想法 wiggle() 确实是一个非常方便的工具,但有时您希望对它有更多的控制。在本例中,我们希望仅将摆动限制在水平方向。 设计 要理解 wiggle() 最重要的一点是,它生成的结果与应用它的属性具有相同的维度。例如,如果你将 wiggle() 应用于 3D 层的 position 属性,结果将是一个由三个元素组成的数组(x、y 和 z 各一个)。我们需要做的就是将 wiggle() 的结果捕捉到一个变量(我们称之为 “w” ),然后从这个变量中提取我们想

ShaderJoy 的兴趣技术杂货铺 2095

Android 泽宇GC垃圾回收机制算法

GC是什么? GC的英文全称是:Gabage Collection,翻译成中文就是垃圾回收的意思。在一个对象不再被程序引用时,它所占用的堆空间就可以回收,以便于分配给新的对象使用。 那我们在了解回收机制要先了解的知识有哪些 我们先说三个英语 (Minor GC) vs (Major GC) vs (Full GC) Minor GC代表着新生 Major GC是清理旧老的 Full ...

android与java开发 1190

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android垃圾回收机制及程序优化System.gc

android垃圾回收机制及程序优化System.gc By admin on 2013/07/20 1.垃圾收集算法的核心思想   Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。   垃圾收集算法的核心思想是:对

wuqiong_524itcast的专栏 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android GC 垃圾回收详解

1. 垃圾回收的意义   在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放

Max 学习笔记 2961

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android垃圾回收(GC)

何为GC GC是garbage collection的缩写,垃圾回收的意思,也可以叫Garbage Collector,也就是垃圾回收器 垃圾回收器的职责 分配内存 确保任何被引用的对象保留在内存中 回收不能通过引用关系找到的对象的内存 GC回收算法 1. 标记回收算法(Mark and Sweep GC) 从"GC Roots"集合开始,将内存整个遍历一次,保留所有可以被GC Roots直接...

weixin_33834910的博客 249

Android内存使用——垃圾回收LOG,GC_CONCURRENT等的意义的说明

在调试程序的时候,经常发现GC_CONCURRENT之类的打印。在网上搜了一下,感觉说法各式各样。最后,在Google的官方网站上发现了详细介绍。 Every time a garbage collection occurs, logcat prints a message with the following information: D/dalvikvm: , , , GC Reas

platte的专栏 1633

android gc,Android 内存 - 垃圾回收(GC)机制

虽然Java大部分内存由垃圾回收器(GC)管理着,但是对内存的释放还是有必要知道一点的,毕竟对我们编程也是有一定的帮助的。例如,解决内存泄露问题等等!!GC回收哪个区域的垃圾这里所说的区域指的是运行时数据区,有5种:程序计数器,虚拟机栈,本地方法栈,堆,方法区。我们一一分析哪个区域由GC管理:程序计数器:这里只保存当前线程锁执行的字节行号,也就是执行到了哪里,只是一块很小的内存,不在GC管理范围内...

weixin_30767323的博客 2319

android 内存回收很慢,Android GC机制介绍(垃圾回收算法)

相信大家在项目测试中都遇到过内存泄露问题,小编也着实爬过很多坑。比如小编所测项目,更换了多实例版本的sdk,横竖屏切换后有MapView没有销毁,导致内存泄露。小编测试手表项目,因为手表内存有限,测试中常遇到应用无响应或者闪退,故而小编对GC机制进行了进一步学习了解。本文先对Android内存垃圾回收机制进行介绍,之后对分析、定位内存泄露常用的测试方法进行总结,分享给大家Android之Java虚...

weixin_39915668的博客 679

(4.4.1.8) android垃圾回收机制及程序优化System.gc

android垃圾回收机制及程序优化System.gc 1.垃圾收集算法的核心思想   Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。   垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对

JAVA成长之路 751
上一篇: 【Android】Handler消息机制详解
下一篇: 【Android TextView】图标下文字的显示
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值