android内存优化面试题,写给Android软件工程师的3条建议

本文作者分享了作为Android开发者在春季的面试经历,重点讨论了Java内存管理、GC机制、JVM内存区域划分以及Android面试中常见的问题,如进程间通信、性能优化工具和内存优化。还提到了OkHttp、Retrofit等三方库的源码分析,并推荐了Android进阶学习资源和大厂面试真题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的移动开发春季历程

没有稳定的工作,只有稳定的能力。

春天,又到了万物复苏的季节,在程序猿这个行当里,作为 Android 开发出生的我,在经历了5年的脱发生涯后,现在更多的是称呼自己为移动开发攻城狮

Java面试题

1.GC机制

垃圾回收需要完成两件事:找到垃圾,回收垃圾。 找到垃圾一般的话有两种方法:

  • 引用计数法: 当一个对象被引用时,它的引用计数器会加一,垃圾回收时会清理掉引用计数为0的对象。但这种方法有一个问题,比方说有两个对象 A 和 B,A 引用了 B,B 又引用了 A,除此之外没有别的对象引用 A 和 B,那么 A 和 B 在我们看来已经是垃圾对象,需要被回收,但它们的引用计数不为 0,没有达到回收的条件。正因为这个循环引用的问题,Java 并没有采用引用计数法。
  • 可达性分析法: 我们把 Java 中对象引用的关系看做一张图,从根级对象不可达的对象会被垃圾收集器清除。根级对象一般包括 Java 虚拟机栈中的对象、本地方法栈中的对象、方法区中的静态对象和常量池中的常量。 回收垃圾的话有这么四种方法:
  • 标记清除算法: 顾名思义分为两步,标记和清除。首先标记到需要回收的垃圾对象,然后回收掉这些垃圾对象。标记清除算法的缺点是清除垃圾对象后会造成内存的碎片化。
  • 复制算法: 复制算法是将存活的对象复制到另一块内存区域中,并做相应的内存整理工作。复制算法的优点是可以避免内存碎片化,缺点也显而易见,它需要两倍的内存。
  • 标记整理算法: 标记整理算法也是分两步,先标记后整理。它会标记需要回收的垃圾对象,清除掉垃圾对象后会将存活的对象压缩,避免了内存的碎片化。
  • 分代算法: 分代算法将对象分为新生代和老年代对象。那么为什么做这样的区分呢?主要是在Java运行中会产生大量对象,这些对象的生命周期会有很大的不同,有的生命周期很长,有的甚至使用一次之后就不再使用。所以针对不同生命周期的对象采用不同的回收策略,这样可以提高GC的效率。

新生代对象分为三个区域:Eden 区和两个 Survivor 区。新创建的对象都放在 Eden区,当 Eden 区的内存达到阈值之后会触发 Minor GC,这时会将存活的对象复制到一个 Survivor 区中,这些存活对象的生命存活计数会加一。这时 Eden 区会闲置,当再一次达到阈值触发 Minor GC 时,会将Eden区和之前一个 Survivor 区中存活的对象复制到另一个 Survivor 区中,采用的是我之前提到的复制算法,同时它们的生命存活计数也会加一。

这个过程会持续很多遍,直到对象的存活计数达到一定的阈值后会触发一个叫做晋升的现象:新生代的这个对象会被放置到老年代中。 老年代中的对象都是经过多次 GC 依然存活的生命周期很长的 Java 对象。当老年代的内存达到阈值后会触发 Major GC,采用的是标记整理算法。

2.JVM内存区域的划分,哪些区域会发生 OOM

JVM 的内存区域可以分为两类:线程私有和区域和线程共有的区域。 线程私有的区域:程序计数器、JVM 虚拟机栈、本地方法栈 线程共有的区域:堆、方法区、运行时常量池

  • 程序计数器。 每个线程有有一个私有的程序计数器,任何时间一个线程都只会有一个方法正在执行,也就是所谓的当前方法。程序计数器存放的就是这个当前方法的JVM指令地址。
  • JVM虚拟机栈。 创建线程的时候会创建线程内的虚拟机栈,栈中存放着一个个的栈帧,对应着一个个方法的调用。JVM 虚拟机栈有两种操作,分别是压栈和出站。栈帧中存放着局部变量表、方法返回值和方法的正常或异常退出的定义等等。
  • 本地方法栈。 跟 JVM 虚拟机栈比较类似,只不过它支持的是 Native 方法。
  • 堆。 堆是内存管理的核心区域,用来存放对象实例。几乎所有创建的对象实例都会直接分配到堆上。所以堆也是垃圾回收的主要区域,垃圾收集器会对堆有着更细的划分,最常见的就是把堆划分为新生代和老年代。
  • 方法区。方法区主要存放类的结构信息,比如静态属性和方法等等。
  • 运行时常量池。运行时常量池位于方法区中,主要存放各种常量信息。

其实除了程序计数器,其他的部分都会发生 OOM。

  • 堆。 通常发生的 OOM 都会发生在堆中,最常见的可能导致 OOM 的原因就是内存泄漏。
  • JVM虚拟机栈和本地方法栈。 当我们写一个递归方法,这个递归方法没有循环终止条件,最终会导致 StackOverflow 的错误。当然,如果栈空间扩展失败,也是会发生 OOM 的。
  • 方法区。方法区现在基本上不太会发生 OOM,但在早期内存中加载的类信息过多的情况下也是会发生 OOM 的。

3.类加载过程

4.双亲委派模型

5.Java 中的集合类

6.HashMap 的原理

7.什么情况下 Java 会产生死锁,如何定位、修复,手写死锁

8.sleep 和 wait 的区别

9.join 的用法

10.volatile和synchronize的区别

11.Java中的线程池

12.线程通信

13.Java中的并发集合

14.Java中生产者与消费者模式

15.final、finally、finalize区别

16.Java 中单例模式

17.Java中引用类型的区别,具体的使用场景

18.Exception 和 Error的区别

19.volatile

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KDSHAFk-1648367489037)(https://upload-images.jianshu.io/upload_images/22459598-395c102996d578cf?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

网络相关面试题

1.http 状态码

2.http 与 https 的区别?https 是如何工作的?

3.TCP三次握手流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eA6EKAco-1648367489038)(https://upload-images.jianshu.io/upload_images/22459598-024bbccfb98670ad?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

Android面试题

1.进程间通信的方式有哪几种

AIDL 、广播、文件、socket、管道

2.广播静态注册和动态注册的区别

  1. 动态注册广播不是常驻型广播,也就是说广播跟随 Activity 的生命周期。注意在 Activity 结束前,移除广播接收器。 静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
  2. 当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态
  3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
  4. 当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的。

3.Android 性能优化工具使用(这个问题建议配合Android中的性能优化)

Android 中常用的性能优化工具包括这些:Android Studio 自带的 Android Profiler、LeakCanary、BlockCanary

Android 自带的 Android Profiler 其实就很好用,Android Profiler 可以检测三个方面的性能问题:CPU、MEMORY、NETWORK。

LeakCanary 是一个第三方的检测内存泄漏的库,我们的项目集成之后 LeakCanary 会自动检测应用运行期间的内存泄漏,并将之输出给我们。

BlockCanary 也是一个第三方检测UI卡顿的库,项目集成后Block也会自动检测应用运行期间的UI卡顿,并将之输出给我们。

4.Android中的类加载器

  • PathClassLoader,只能加载系统中已经安装过的 apk
  • DexClassLoader,可以加载 jar/apk/dex,可以从 SD卡中加载未安装的 apk

5.Android中的动画有哪几类,它们的特点和区别是什么

6.Handler 机制

7.Android 性能优化

8.Android 内存优化

9.Binder 机制

10.LruCache的原理

11.DiskLruCache原理

12.设计一个图片的异步加载框架

13.Android中的事件分发机制

14.View的绘制流程

15.Android 源码中常见的设计模式以及自己在开发中常用的设计模式

16.Android与 js 是如何交互的

17.热修复原理

18.Activity 启动过程

19.SparseArray 原理

20.图片加载如何避免 OOM

21.大图加载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6GpcI7K1-1648367489039)(https://upload-images.jianshu.io/upload_images/22459598-3ad38a7be79739a0?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

Android三方库的源码分析

1.OkHttp

2.Retrofit

3.RxJava

4.Glide

5.EventBus

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k2UH16Nu-1648367489039)(https://upload-images.jianshu.io/upload_images/22459598-b680e2fbe1ed6ed5?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

数据结构与算法

1.手写快排

2.手写归并排序

3.手写堆以及堆排序

4.说一下排序算法的区别(时间复杂度和空间复杂度)

工作中解决了什么难题,做了什么有成就感的项目(这个问题一定会问到,所以肯定要做准备)

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

优秀开源项目:

  • ali1024.coding.net/public/P7/Android/git

  • github.com/android

尾声

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9C5Tk9l6-1648367489040)(https://upload-images.jianshu.io/upload_images/22459598-cece85a5d1145a94.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJ1059SF-1648367489040)(https://upload-images.jianshu.io/upload_images/24216715-993f8abf94fdf95d.png?imageMogr2/auto-orient/strip|imageView2/2/w/748/format/webp)]

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cNt2A5uf-1648367489042)(https://upload-images.jianshu.io/upload_images/24216715-31230fc9e579c189.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qOJt1R62-1648367489043)(https://upload-images.jianshu.io/upload_images/24216715-4e8c7bfedc63a630.png?imageMogr2/auto-orient/strip|imageView2/2/w/930/format/webp)]

《2017-2021字节跳动Android面试历年真题解析》

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufPjsRR6-1648367489043)(https://upload-images.jianshu.io/upload_images/24216715-20a629c03c4bd4b0.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]
滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-qOJt1R62-1648367489043)]

《2017-2021字节跳动Android面试历年真题解析》

[外链图片转存中…(img-ufPjsRR6-1648367489043)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值