【Android 内存管理】JVM 内存模型与 GC 原理

Android GC原理探究(深度好文) 相信大家都遇到过手机图片滑动卡顿问题,由于不断的GC导致的丢帧卡顿的问题让我们想了很多方案去解决,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GC ALLOC和GC COCURRENT有什么区别,能不能想办法扩大堆内存减少GC的频次等等。 1、JVM内存回收机制 1.1 回收算法 标记回收算法(Mark and Sweep GC) 从"GC Roots"集合开始,将内存整个遍... 阅读详情

1. JVM 内存模型

1.1 运行时数据区总览

JVM 运行时数据区分为线程私有与线程共享两大类,这是所有内存问题的基础心智模型。
在这里插入图片描述

1.2 堆内存分代

传统 HotSpot 堆采用分代假设:弱分代假设(多数对象朝生夕死)与强分代假设(熬过多次 GC 的对象难以消亡)。

  • 新生代(Young Gen):Eden + 两个 Survivor(From / To),默认比例 8:1:1。新对象优先在 Eden 分配,大对象直接进入老年代。
  • 老年代(Old Gen):长期存活对象、大对象、担保失败对象。
  • 永久代(Perm Gen):JDK 7 及之前存放类元数据,JDK 8 被元空间(Metaspace)取代,使用本地内存而非堆内存。

Android 的 Dalvik/ART 不采用 HotSpot 的分代堆结构(早期 ART 也没有分代),直到 Android 13 才引入分代 CC。面试时切勿直接套用 HotSpot 分代模型回答 Android GC。

1.3 对象的内存布局

HotSpot 中对象在堆中由三部分组成:

  1. 对象头(Header):Mark Word(哈希码、GC 分代年龄、锁状态)+ 类型指针(指向类元数据)+ 数组长度(数组对象才有)。
  2. 实例数据(Instance Data):字段值,按对齐规则排列。
  3. 对齐填充(Padding):8 字节对齐,保证对象起始地址为 8 的倍数。
    Android ART 的对象布局类似,但使用 Compressed Oops(32 位压缩指针)在 64 位设备上节省内存,堆上限不超过 4GB 时默认开启。

1.4 Android 内存区域划分 ****

Java 堆(ART 虚拟机内存) 和 进程整体虚拟内存

1.4.1 ART 虚拟机内存(Java 层)

  1. 堆 Heap
    所有 Java/Kotlin 对象、数组分配在这里。GC 主要管理这块内存。
  • 新生代(Young):新创建对象,存活时间短,频繁 Minor GC。
  • 老年代(Old):熬过多次 GC 的对象,大对象直接进入老年代,发生 Major GC。

注意:Android 没有永久代;类信息存放在 Image Space / Zygote Space / App Image。

  1. Zygote Space(Zygote 堆)
    Zygote 进程孵化 App 时复制过来,存放系统预加载的类、资源。所有 App 进程共享只读部分,写时复制 COW。
  2. Image Space
    ART 预编译 oat 产生,存放预加载类、方法元数据,内存映射,提升启动速度。
  3. 线程栈(Thread Stack)
    每个 Java 线程拥有私有栈,存放局部变量、方法调用栈帧。栈上只存引用,对象在堆;栈内存固定大小,栈溢出会抛出StackOverflowError。
  4. 方法区(元空间 Meta‑Space)
    存放 class 字节码元信息:类结构、方法、字段、常量。Android 8 + 使用元空间,属于 Native 内存,不在 Java 堆,不受 Heap 大小限制。
  5. 常量池
    字符串常量、字面量,一部分在元空间,字符串会驻留到堆。

1.4.2 Native 层内存(C/C++)

  1. Native Heap
    malloc / new 分配,Bitmap 像素缓冲区、自定义 Native 库、OpenGL 缓冲区都在这里。

重点面试点:Native 堆不受 Java Heap 限制,即使 Java 堆没 OOM,Native 堆耗尽同样会触发 App OOM。libart.so、第三方 so 库内存占用在这里。

  1. Native 线程栈
    native 线程私有栈。

2. Android 运行时内存特殊性

2.1 Dalvik 与 ART 的核心差异

在这里插入图片描述

2.2 Android 堆大小限制

每个 App 进程的堆大小由系统属性控制,而非 JVM 的 -Xmx:

  • dalvik.vm.heapsize:默认堆上限,普通设备通常 192MB / 256MB / 384MB。
  • largeHeap:Manifest 中声明 android:largeHeap=“true” 可申请更大堆(dalvik.vm.largeheap),通常 512MB,但不保证所有设备都生效,且会增加 GC 压力。
  • 前台/后台差异:后台进程的堆上限可能被收紧,系统通过 setDalvikHeapLimit 动态调整。
<application
    android:largeHeap="true"
    android:hardwareAccelerated="true">
</application>

2.3 Zygote 与共享内存

Android 所有 App 进程由 Zygote fork 而来,这带来两个关键内存特性:

  1. 写时复制(COW):fork 后子进程共享 Zygote 的只读页(框架类、资源),只有写入时才复制。这意味着系统类的元数据不占用每个 App 的独立内存。
  2. 预加载:Zygote 预加载常用类和资源,fork 后子进程直接共享,降低启动内存与时间。
    面试延伸:为什么 Android 不直接用 JVM? 因为移动设备内存受限,Dalvik/ART 针对寄存器架构优化,dex 比 class 更紧凑,且 Zygote 的 COW 机制能大幅降低多进程内存开销。

2.4 Native 内存与 Java 堆的关系

Android 的内存压力不仅来自 Java 堆,还包括:

  • Graphics 内存:Bitmap 在 Android 3.0 前存放在 Native 堆,3.0+ 移至 Java 堆;Android 8.0+ 又将 Bitmap 像素数据移回 Native(HardwareBuffer),Java 堆只存引用。
  • Native 堆:so 库分配的内存,不受 Java 堆上限限制,但受进程总虚拟内存限制(32 位进程约 3-4GB)。
  • 代码映射:dex、oat、so 的 mmap 映射内存。
  • Stack:每个线程默认 1MB 栈空间,线程数过多会导致虚拟内存耗尽。

Android 8.0+ Bitmap 像素存 Native 的好处:Java 堆 OOM 概率降低,但 Native 内存泄漏更难排查,需用 Perfetto / heapprofd 定位。

3. GC 算法基础

3.1 如何判断对象可回收

3.1.1 引用计数法

每个对象维护引用计数器,引用 +1,失效 -1,计数为 0 即回收。无法解决循环引用,Python 采用但需配合分代回收。JVM 不采用。

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

从 GC Roots 出发,遍历引用链,不可达的对象判定为可回收。这是 JVM / ART 采用的算法

GC Roots 包括:

  • 虚拟机栈中引用的对象(局部变量)
  • 方法区中静态变量引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中 JNI 引用的对象
  • 活跃线程本身
  • ART 特有的:Image Roots(boot.art 中的对象)、Thread Roots、Interned Strings

3.2 四种引用类型

在这里插入图片描述

3.3 经典 GC 算法

3.3.1 标记-清除(Mark-Sweep)

标记所有可达对象,清除未标记对象。缺点:产生内存碎片,分配大对象时可能提前触发 GC。

3.3.2 复制算法(Copying)

将存活对象复制到另一块区域,清空原区域。优点:无碎片,分配快;缺点:空间利用率低(50%)。适用于新生代(对象存活率低)。

3.3.3 标记-整理(Mark-Compact)

标记后将存活对象向一端移动,清理边界外内存。优点:无碎片;缺点:移动对象开销大,需 STW。适用于老年代。

3.3.4 分代收集

结合上述算法:新生代用复制(Minor GC),老年代用标记-清除或标记-整理(Major GC / Full GC)

4. Android GC 演进与实现

在这里插入图片描述

4.1 Dalvik GC

Dalvik 使用 Concurrent Mark-Sweep(CMS),流程:

  1. 初始标记(STW):标记 GC Roots 直接引用的对象,停顿短。
  2. 并发标记:与用户线程并发,从 GC Roots 遍历所有可达对象。
  3. 并发预清理:处理并发标记期间引用变化的对象(Card Table)。
  4. 重新标记(STW):修正并发标记期间变动的对象,停顿较长。
  5. 并发清除:清除不可达对象。

问题:CMS 不压缩,堆碎片化严重;大对象分配失败时退化为 Full GC(全部 STW),卡顿明显。

4.2 ART Concurrent Copying(CC)

Android 8.0+ 默认使用 Concurrent Copying(CC),这是 Android GC 的核心面试点。
核心思想:将堆分为多个 Region,GC 时把存活对象从 From-Space 复制到 To-Space,利用读屏障(Read Barrier)保证并发复制时用户线程总能读到正确对象。
关键机制:

  • Region 化堆:堆被划分为固定大小的 Region(通常 256KB),对象按大小分配到不同 Region。
  • baker 读屏障:每次对象引用读取时检查是否已被复制,若在 From-Space 则转发到 To-Space。通过字节码插桩或硬件支持实现。
  • 无 STW 复制:整个复制过程并发执行,只有 GC 开始和结束时短暂 STW(通常 < 2ms),且停顿时间与堆大小、存活对象数无关。
  • 无碎片:复制过程天然压缩,消除内存碎片。

4.2.1 CC 的 GC 触发时机

  • Concurrent GC:堆使用量达到水位线(如 25% / 45%)时触发,后台并发执行。
  • Alloc GC:分配对象时空间不足,触发同步 GC(可能 STW)。
  • Native allocation fails:Native 分配失败时触发。
  • Explicit GC:调用 System.gc()(ART 默认忽略,除非设置 -XX:+DisableExplicitGC 为 false)。

4.3 Android 13+ 分代 CC

Android 13(Tiramisu)引入分代 Concurrent Copying(Generational CC),将堆分为年轻代和老年代:

  • 年轻代 GC:只扫描年轻代 Region,频率高但范围小,停顿更短。
  • 老年代 GC:全堆扫描,频率低。
  • 跨代引用:通过写屏障(Write Barrier)+ Card Table 记录老年代对年轻代的引用,避免年轻代 GC 时扫描全堆。
    这使得 Android GC 终于与 HotSpot 的分代思想对齐,但实现仍是 CC 而非传统的分代复制/标记整理。

4.4 三色标记与 SATB

并发标记的核心难题是用户线程与 GC 线程并发修改引用关系,可能导致存活对象被漏标。三色标记法将对象分为:

  • 白色:未访问,可能可回收。
  • 灰色:已访问但其引用的对象尚未全部处理。
  • 黑色:已访问且所有引用对象都已处理。

漏标条件(必须同时满足):

  1. 黑色对象新增了对白色对象的引用。
  2. 灰色对象删除了对该白色对象的引用。

解决方案:

  • 增量更新(Incremental Update):黑色对象新增引用时,将其变回灰色(写屏障)。CMS 采用。
  • SATB(Snapshot At The Beginning):GC 开始时保存对象图快照,删除引用时记录旧引用到 GC 栈,确保快照中存活的对象最终都被标记。G1 采用。

5. 内存泄漏与优化

5.1 Android 常见内存泄漏场景

在这里插入图片描述

5.2 Bitmap 内存优化

  • inSampleSize:采样率压缩,按 2 的幂次缩放,避免 OOM。
  • inBitmap:复用已分配的 Bitmap 内存,减少 GC 频率(Android 3.0+ 支持,4.4+ 支持不同尺寸复用)。
  • RGB_565:不透明图片用 2 字节/像素替代 ARGB_8888 的 4 字节/像素,内存减半。
  • recycle():Android 8.0 前手动释放 Native 像素内存;8.0+ 像素在 Native,由 GC 管理,但仍建议在不再使用时 recycle。
  • Glide / Coil:使用成熟图片库,内置内存缓存、复用、生命周期管理。

5.3 内存优化最佳实践

  1. 避免在循环中创建对象:如 onDraw、onBindViewHolder 中避免 new 对象。
  2. 对象池化:频繁创建销毁的对象使用 Pool(如 Message.obtain())。
  3. SparseArray 替代 HashMap:key 为 int 时,SparseArray 避免自动装箱,内存更省。
  4. ArrayMap 替代 HashMap:小数据量(< 1000)时内存更优,但查找复杂度 O(logN)。
  5. 枚举优化:枚举比静态常量多占用约 2-3 倍内存,可用 @IntDef / @StringDef 替代。
  6. 避免过度绘制:减少布局层级,移除不必要背景,降低 GPU 内存与渲染开销。
  7. onTrimMemory 回调:实现 ComponentCallbacks2,根据内存等级释放缓存。

6. 内存分析工具

6.1 工具对比

在这里插入图片描述

6.2 内存泄漏排查流程

  1. 复现:反复进出可疑页面,回到桌面,触发 GC(Memory Profiler 中点击垃圾桶图标)。
  2. Dump 堆:点击 Dump Java Heap,生成 hprof 文件。
  3. 分析:按包名筛选,查看是否有已销毁的 Activity/Fragment 仍存活。
  4. 定位引用链:查看该对象的 GC Roots 引用链,找到泄漏源。
  5. 验证:修复后重复步骤 1-3,确认对象已被回收。

6.3 内存抖动

答:内存抖动指短时间内大量对象被创建又立即回收,导致 GC 频繁触发。常见于 onDraw 中创建对象、循环中 new 对象、字符串拼接。排查用 Memory Profiler 的Allocation Tracker(分配追踪),查看高频分配的对象类型和调用栈,将临时对象移到循环外或使用对象池。

6.4 Android 8.0 前后 Bitmap 内存分配有什么变化?

Android 2.3.3 及以下,Bitmap 像素数据存 Native 堆,需手动 recycle();
Android 3.0-7.1,像素数据存 Java 堆,随对象 GC 回收;
Android 8.0+,像素数据又移回 Native(通过 HardwareBuffer / ashmem),Java 堆只存 Bitmap 对象引用和少量元数据。好处是降低 Java 堆 OOM 概率,Native 内存由 NativeAllocationRegistry 关联 Java 对象生命周期自动回收。

GC优化实战:从JVM内存模型到参数调优的完整排查路径 当线上服务响应变慢、Full GC频率飙升时,许多团队容易陷入盲目调参的误区。GC优化的本质是在吞吐量、停顿时间和内存占用之间寻找平衡,而理解JVM内存模型与分代回收机制是前提。从Parallel GC到G1、ZGC,不同回收器对应不同业务场景。真正的调优路径始于监控堆使用率与GC日志,通过jstat、MAT等工具定位根因,而非直接修改启动参数。本文梳理了从现象到根因的排查案例,并给出参数调整的验证方法,同时涵盖Android、Unity等跨语言场景的GC优化思路,帮助开发者建立一套可落地的判断框架。 阅读详情

相关推荐

PyQt5 + HFSS:给你的仿真脚本做个专属GUI界面(零基础搭建指南)

本文详细介绍了如何使用PyQt5为HFSS仿真脚本创建专属GUI界面,适合零基础用户快速上手。通过Python二次开发,实现参数可视化调整、进度实时监控等功能,大幅提升团队协作效率。文章涵盖环境配置、界面设计、HFSS集成到打包部署的全流程,是仿真工程师提升工作效率的实用指南。

weixin_42535720的博客 185

Android JVM 原理简析

学习 Android JVM(包括 Dalvik 和 ART)的重要作用在于深入了解 Android 应用程序的执行原理和内部工作机制,能够更好地理解和利用底层的执行环境,编写出高性能、可靠的应用程序。

特立独行的博客 2399

别再死磕AUTOSAR文档了!手把手教你用ISOLAR-A配置BswM模块(附实战流程图)

本文通过Vector ISOLAR-A工具实战演示AUTOSAR BswM模块的配置流程,帮助工程师快速掌握基础软件模式管理。从环境准备到模式仲裁规则配置,再到动作列表实现,详细讲解每个步骤,并提供常见问题排查和高级优化技巧,大幅提升开发效率。

weixin_42542669的博客 250

JVM和Android虚拟机知识点总结

1. 2. 3. 4. 参考材料

wodongx123的博客 1083

【LVGL】学习笔记--(3)界面切换以及显示优化

界面切换和帧率优化

sinat_33408502的博客 1万+

[漏洞利用]利用五次Shift越权破解win7\win10开机密码

注:第一个学习和接触的Windows漏洞 文章目录本机实验环境前置知识漏洞原理漏洞介绍漏洞验证解决方法基本流程介绍详细步骤截图 本机实验环境 虚拟机:VMware Workstation 14 pro 操作系统:Windows10 前置知识 1、cmd工具路径 c:\windows\system32\cmd,按五次shift默认调用同目录下sethc文件,其路径为“c:\windows\system32\sethc.exe” 2、用户/账户密码存储位置 c:\windows\system32\config\

Y4tacker的博客 2万+

Android知识:JVM运行机制

JVM的启动流程、基本结构、内存模型和类加载机制是Java虚拟机运行Java程序的基础。了解这些概念和机制对于深入理解Java程序的行为、优化程序性能以及解决多线程和并发问题都具有重要意义。通过本文的详细阐述,希望读者能够对JVM有更深入的认识和理解。个人网站:www.rebootvip.com更多SEO优化内容 网站学习 google adsense资源免费分享下载:电子书,项目源码,项目实战** ** Python 从入门到精通 ** **** ** Java 从入门到精通 ** **

孔乙己大叔的博客 1607

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 910

Android程序员需掌握的JVM知识

什么是JVM JVM 全称 Java Virtual Machine,它是一种规范。JVM 是一个虚拟化的操作系统,类似于 Linux 或者 Windows 的操作系统,只是它架在操作系统上,接收字节码,把字节码翻译成操作系统上的机器码且进行执行。 为什么需要学习JVM Android的运行环境都是在ART虚拟机或者是Dalvik虚拟机上,为什么Android程序员需要学习JVM,理解JVM可以帮助我们更好的了解Java内存区域、对象的创建和内存分配、垃圾的回收以及常见的垃圾回收算法等等,然后将其运用到An

小久久的博客 7170

【目录】专栏文章导航

从最强工具链Davinci Configurator模块学习出发掌握AUTOSAR

weixin_47571898的博客 3295

TC3XX - MCAL知识点(三十三):基于EB Tresos配置Tc3xx的MCAL代码如何产生中心对称的三相六路发波波形

本文用于记录如何在英飞凌 tc3xx 芯片的应用开发中,借助 EB Tresos 配置工具生成的配置代码与 MCAL 源码相结合,进而实现三相六路中心对称互补的 PWM 输出效果。外部资源需求:EB Tresos23.0以上、Tasking\Hightec编译器、示波器\逻辑分析仪。

梦想技术家 1212

Android之JVM基础

作者:贾里 1.JVM与操作系统的关系 Java Virtual Machine JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。 翻译 Java 程序不一样,使用 javac 编译成 .class 文件之后,还需要使用 Java 命令去主动执行它,操作系统并不认识这些 .class 文件。所以JVM就是一个翻译。 从图中可以看到,有了 JVM 这个抽.

鸿蒙开发知识记录 2834

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android 性能优化系列:抖音团队详解 Java 内存管理的底层原理与优化策略

在抖音的实战中,一次优化案例涉及直播模块:通过分析堆转储,发现未关闭的实例导致内存泄漏。修复后,OOM 错误率下降 90%。原理驱动优化:理解 GC 机制才能针对性调参。工具结合代码:自动化检测 + 严格编码规范。性能与平衡:过度优化可能增加复杂度,需权衡业务需求。总之,Java 内存管理优化是 Android 性能提升的杠杆点。抖音团队的实践表明,深入底层原理并实施结构化策略,可显著提升应用流畅度。建议开发者从监控工具入手,逐步迭代优化,打造更稳健的应用。

2501_93895056的博客 616

OV9734 DATASHEET,完整规格书

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

2019年Android岗位BAT等大厂面试题知识点小结,2021最新Android高频精选面试题讲解

ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大 用个比喻来说就是,骑自行车 dalvik 是已经折叠起来的自行车,每次骑都要先组装自行车才能骑 ART 是已经组装好的自行车,每次骑直接上车就能走人 详情:http://www.jb51.net/article/88708.htm 虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派): 在加载阶段,java虚拟机需要完成以下3件事: a.通过一个类的全限定名来获取定义此类的二进制字节流。 b.将定义类的二进

m0_66144992的博客 240

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

这是一份面向3年以上Android开发者的中高级面试宝典,拔剑金九银十,大厂直通车

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。欢迎大家一起交流讨论啊~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!6950561)]欢迎大家一起交流讨论啊~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

2401_84010326的博客 1024

最新大厂Android面试题集——答案+解析

接触Android已经3年,在工作中遇到疑难问题总是在网上搜索答案,各位大牛大神总是把自己的经验分享出来,帮助我们这些需要帮助的人,由此表示衷心感谢!然而现在自己细想了一下,自己也是时候把遇到的问题并把解决方案分享出来,希望能帮助到有需要的人。

Android23333的博客 782

为什么Flutter能最好地改变移动开发?Android校招面试指南

安卓基础知识 安卓基础知识确实很多,如果日常积累不够的话确实比较头晕,比如我承认我只在 APP 升级的时候搞过一个前台的 Service,但是面试的时候就会问你 Service 生命周期,如何绑定,如何跨进程通讯,如何关闭Service 等等,你肯定不能说"我没用过我不会"。 所以我们就要复习,一来我们可以应付面试,二来我们也可以通过基础知识的积累来提高我们的能力。 Android面试中有哪些常见问题汇总&答题思路 目录: 1.网络 2.Java 基础&容器&同步&设计模式

134

Java基础核心考点深度解析:Android面试必备与实战应用

Java作为Android开发的基石语言,其核心原理深刻影响着应用性能与稳定性。理解Java内存模型(JMM)和垃圾回收(GC)机制,是解决内存泄漏和优化程序运行效率的关键。在并发编程中,掌握线程池、锁机制及原子类,能有效提升多线程任务的管理能力与数据安全性。这些基础概念直接映射到Android开发场景,例如Handler的内存泄漏防范、RecyclerView数据源的高效管理,以及全局缓存的多线程安全设计。本文聚焦HashMap、ConcurrentHashMap等集合框架的演进与差异,并深入剖析sync

weixin_30861459的博客 347

腾讯、网易必问的20道题Android面试题,已拿offer附真题解析

大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助。 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了… 所以啊,不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流~ 1、网络 网络协议模型 应用层:负责处理特定的应用程序细节 HTTP、FTP、DNS 传输层:为两台..

m0_56259669的博客 219

Android内存管理机制

转发Android内存管理机制 这篇文章讲解的很详细,我以自己方式进行总结。 Java内存分配 线程私有:程序计数器,虚拟机栈,本地方法栈 线程共享:堆,方法区 程序计数器 :当前线程所指向的字节码指示器,Java方法存放虚拟机字节码指令地址,Native方法,计数器值为Undefined,唯一不存在OOM 虚拟机栈:当线程每个方法执行时都创建一个栈帧用来存放局部变量,方法出口等,并将该栈帧放在JVM栈中。如果栈深度大于虚拟机允许最大深度,抛出StackOverFlowError,不过虚拟机基本都允许动态扩

neabea2016的博客 1069

android gc 原理,Android GC原理探究

前言想写一篇关于android GC的想法来源于追查一个魅族手机图片滑动卡顿问题,由于不断的GC导致的丢帧卡顿的问题让我们想了很多方案去解决,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GC ALLOC和GC COCURRENT有什么区别,能不能想办法扩大堆内存减少GC的频次等等。1、JVM内存回收机制1.1 回收算法标记回收算法(Mark and Sweep GC)从”GC...

weixin_39760206的博客 400

271.JVM内存模型

专门为JNI本地方法服务,在Android开发中经常遇到。

2303_79132118的博客 888

Awesome-Android-Interview JVM虚拟机:执行过程、GC原理、类加载器详解

JVM(Java虚拟机)作为Java技术的核心基石,负责执行Java字节码并提供跨平台能力。掌握JVM虚拟机的执行过程、GC原理和类加载器机制,对于Android开发者的技术成长至关重要。本文将深入解析JVM的三大核心组件,帮助你在面试中游刃有余!🚀 ## 🎯 JVM执行过程与内存结构 JVM的执行过程从类加载开始,经历字节码验证、准备、解析、初始化等阶段,最终通过执行引擎运行程序。整个过

gitblog_00450的博客 752

GC那些事儿--Android内存优化第一弹

由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Android内存管理, Dalvik/ART等知识有一个理论的认识, 可以让我们更好的使用这些工具, 分析内存问题. 据此, 我们就先从理论入手, 聊聊GC那些事儿.

anly_jun的博客 812

【底层机制】Android GC -- 为什么要有GC?GC的核心原理?理解GC的意义

写出高性能、低卡顿的代码:通过避免内存泄漏和减少不必要的对象分配。 快速定位和解决内存问题:当发生OOM或内存抖动时,能迅速找到根源。 建立良好的内存观:知道代码的每一行背后可能发生什么,做到心中有数。

沐怡旸的专栏 1295
上一篇: 【Android 架构】MVC/MVP/MVVM/MVI架构
下一篇: 【Android 面试】Hilt依赖注入
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值