由浅入深理解Android虚拟机—内存模型,垃圾回收机制是如何实现的?

Android内存笔记之基础知识篇 内存是性能的一个重要指标,能直接影响用户的体验,特别是OOM会直接导致进程crash。而内存是一个庞大的知识体系,一两句话没办法讲清楚。所以会以一个系列文章来巩固内存知识。 阅读详情

本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注

从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线。

Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆。 堆是运行时数据区域,所有类实例和数组的内存均从此处分配。 非堆是JVM留给自己用的,包含方法区、JVM内部处理或优化所需的内存(如 JIT Compiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码。

简言之,Java程序内存主要(这里强调主要二字)分两部分,堆和非堆。大家一般new的对象和数组都是在堆中的,而GC主要回收的内存也是这块堆内存。

配一张示意图总结一下:

堆内存(Heap Memory): 存放Java对象 非堆内存(Non-Heap Memory): 存放类加载信息和其它meta-data 其它(Other): 存放JVM 自身代码等

一.堆内存模型

既然重点是堆内存,我们就再看看堆的内存模型。

堆内存由垃圾回收器的自动内存管理系统回收。 堆内存分为两大部分:新生代和老年代。比例为1:2。 老年代主要存放应用程序中生命周期长的存活对象。 新生代又分为三个部分:一个Eden区和两个Survivor区,比例为8:1:1。 Eden区存放新生的对象。 Survivor存放每次垃圾回收后存活的对象。


看晕了吧,关注这几个问题:

  • 为什么要分新生代和老年代?
  • 新生代为什么分一个Eden区和两个Survivor区?
  • 一个Eden区和两个Survivor区的比例为什么是8:1:1?

现在还不能解释为什么,但这几个问题都是垃圾回收机制所采用的算法决定的。 所以问题转化为,是何种算法?为什么要采用此种算法?

二.可回收对象的判定

讲算法之前,我们先要搞清楚一个问题,什么样的对象是垃圾(无用对象),需要被回收? 目前市面

Android面试准备 面试的几个回答技巧 http://blog.sina.com.cn/s/blog_ad991b1601018mjc.html   2013-5-9号补充:今天最新的腾讯面试题,应该说是所有面试中最难的,我个人感觉。 腾讯面试题 1.int a = 1; int result = a+++3 2.int a = 2; int result = (a++ > 2)?(++a):(a 阅读详情

相关推荐

Java程序员面试和笔试题库精粹

在Java中,类是使用关键字class来定义的,其后跟随类名。类可以包含字段(变量)和方法。字段是类的属性,方法是类的行为。// 字段// 构造方法// 方法上述代码定义了一个Person类,拥有两个私有字段name和age,一个构造方法以及一个公共方法。接口在Java中是完全抽象的,它们定义了一组方法规范,供实现它们的类去遵循。// 接口方法以上示例中,Vehicle接口定义了两个方法start()和stop(),而Car。

weixin_42584507的博客 599

阿里高级Android面试挑战:深入探讨Android虚拟机内存模型垃圾回收机制实现细节

为了提高垃圾回收的效率,Android系统会在适当的时机触发GC,比如内存紧张时、低优先级的线程执行时等。同时,Android系统还提供了一些API,允许开发者手动触发GC。不过,手动触发GC可能会影响性能,因此不建议过度依赖这些API。更多的Android中高级面试题解析可以扫码免费领取!!目录第一章 Java方面●Java基础部分●Java集合●Java多线程●Java虚拟机第二章 Android方面●Android四大组件相关●Android异步任务和消息机制。

大模型学习路线 304

本地化搭建DeepSeek+RAGFlow,构建个人知识库

本地化搭建DeepSeek+RAGFlow,构建个人知识库。至少32G以上内存、500G以上空余磁盘空间。

gogospecter的专栏 7373

Android虚拟机内存模型

基于寄存器的虚拟机中没有操作数栈的概念,但是有很多虚拟寄存器,一般情况下这些寄存器(操作数)都是别名,需要执行引擎对这些寄存器(操作数)的解析,找出操作数的具体位置,然后取出操作数进行运算。JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,为了各条线程之间的切换后计数器能恢复到正确的执行位置,所以每条线程都会有一个独立的程序计数器。堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中)。

酌沧 2472

Java垃圾回收机制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34051201的博客 312

Android虚拟机垃圾回收解析,简单明了看完通透

内存分配阶段:当应用需要加载新的类或创建新的对象时,Android虚拟机会根据需要动态分配内存空间。分代回收阶段:Android虚拟机采用分代垃圾回收机制,将内存分为不同的代,根据不同代的对象生命周期,选择不同的垃圾回收策略进行回收,以优化内存的使用。并发标记阶段:应用程序正常运行时,Android虚拟机会启动一个线程用于对堆内存进行并发标记,标记存活对象,以便后续的清理操作。并发清理阶段:在并发标记阶段结束之后,虚拟机会启动一个线程来清理不可达对象,以回收内存空间。

m0_71524094的博客 718

12年高级工程师的“飞升之路”,震撼来袭免费下载!

前言 众所周知,Android是一个基于Linux实现的操作系统。但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别。 所以Android也需要运行环境,需要Linux内核在启动完成后加载Android Framework运行所需要的资源。当Framework完成初始化后才能继续启动相应的APK应用程序。 Framework这么重要,那我们该如何学习呢? 关于如何学习Android Framework开发知识,最近有幸在前阿里技术总监手

m0_56255097的博客 146

android虚拟机内存,一、Android 虚拟机内存模型

一、内存模型image.png1.程序计数器: 确定程序指令执行顺序的,是唯一一块不会发生内存溢出的区域它是线程私有的,负责记录当前线程空间字节码执行的行号(当线程切换后,由于有程序计数器来记录执行的地方,所以能够正确恢复到指定的位置)2. Java虚拟机栈**它也是线程私有的,负责存储方法内的局部变量,方法出口等。每执行一个方法都相当于压如一个栈帧,方法执行完比后这个栈帧从Java虚拟机栈中弹出...

weixin_39764603的博客 335

android面试

1.请解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。 简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理。 Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某

liuweihui521的专栏 609

android虚拟机理解,包括内存管理机制,垃圾回收机制

与windows内存区别        在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方面,区别于 Windows的内存管理。主要特点是,无论物理内存有多大,Linux都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows是只在需

u013628732的专栏 2176

安卓面试题库

1.什么是Activity?  通俗一点说Activity就是一个界面,这个界面里面可以放置各种控件。Activity的界面也是用xml文件表示的,放置在res->layout下面。每生成一个新的Activity后,我们需要在AndroidManifest.xml中注册一下这个activity。 2.请描述一下Activity生命周期。 onCreate(Bundle savedInstan

Mikes的专栏 1061

准备换工作 , 有备无患

什么是Activity? 请描述一下Activity生命周期。 两个Activity之间跳转时必然会执行的是哪几个方法。 横竖屏切换时候Activity的生命周期。 如何将一个Activity设置成窗口的样式。 你后台的Activity被系统 回收怎么办? 如何退出Activity? 如何安全退出已调用多个Activity的Application? 如果后台的Activity由于某

RockCoding的专栏 3107

Android虚拟机理解和内存管理

虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M , 谈谈加载图片的时候怎么处理大图片的, outmemoryException BitmapFactory.option  垃圾回收,没有引用的对象,在某个时刻会被系统gc掉 . Dalvik和标准Java虚拟机(JVM)首要差别 Dalvik 基于寄存器,而 JVM 基于栈。 基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行...

augfun的博客 541

Android虚拟机原理面试题汇总(含详细解析 六)

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊👀你想要的面试题这里都有👀👇👇👇。

Misdirection_XG的博客 181

Android ART虚拟机 GC流程分析

本文分析ART虚拟机的GC流程,主要函数从CollectGarbageInternal开始。当配置CMS为默认回收器时: - collector_type_为kCollectorTypeCMS。 - foreground_collector_type_取值为kCollectorTypeCMS。它代表程序位于前台时使用的回收器类型。 - background_collector_type_的取值为kCollectorTypeHomogeneousSpaceCompact。它代表程序位于后台时使用的回收器类型。

baiiu 1228

JVM垃圾回收算法(标记清除、标记整理、复制)

和标记清除一样,标记整理的第一个阶段也是对垃圾对象进行标记,区别主要在第二个步骤,即整理。所谓的整理就是避免之前标记清除时的内存碎片的问题,他就会在清除的过程中,会把可用的对象向前给他移动,这样的话让内存更为紧凑,这就是整理的过程。整理之后,就能发现内存变的更紧凑了,即连续的空间就更多了,这样就不会造成内存碎片。复制算法比较特殊,他把内存区域划分成了大小相等的两块儿区域,左边区域称之为FROM,右边区域称之为TO,其中TO这个区域始终空闲着,即里面一个对象都没有。

Cyx12321的博客 3461

Android面试】Java虚拟机相关面试

对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收回收。可达性分析:从一个根对象(GC Root)开始向下搜寻,可以认为搜寻到的所有有强引用的对象都是活跃对象,所有找不到的对象都是无用对象,无用对象可能会被即刻回收,也可能进行其他操作(比如执行对象的finalize() 方法)栈记录了方法调用,每个线程拥有一个栈,栈的每一帧中保存有该方法调用的参数、局部变量、返回地址栈中被调用方法运行结束时,相应的帧会删除,参数和局部变量占用的空间也会释放,堆是用来存储对象的,堆区由所有线程共享。

xiaokangss的博客 294

android虚拟机理解,包括内存管理机制垃圾回收机制。dalvik和art区别

虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M , 谈谈加载图片的时候怎么处理大图片的, outmemoryException BitmapFactory.option  垃圾回收,没有引用的对象,在某个时刻会被系统gc掉 . Dalvik和标准Java虚拟机(JVM)首要差别 Dalvik 基于寄存器,而 JVM 基于栈。 基于寄存器的虚拟机对于编译后变大的程

JJMM2009的专栏 4871
上一篇: AOP与OOP有什么区别,谈谈AOP的原理是什么
下一篇: 浅谈Kotlin解析之设计模式
初壹十五a
博客等级 码龄7年 146粉丝 257原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值