美团24秋招 客户端二面
面试的是点评事业部,面试时间为9月7号,时间间隔有点久,只能复盘到一部分问题。
面试内容:
- 简历内有提到做内存管理相关的事情,具体有做哪些?
- 资源管理方向:
- 对现有的资源进行压缩等操作,比如把图片变成Webp形式;
- 更改一些缓存策略;
- 比如在使用viewPAge的时候考虑只预加载部分,加快性能的同时能节省内存空间
- 网络通信协议的缓存策略可以使用更合适的策略
- 运行内存管理:
- 解决内存泄露的场景,具体可以通过MAT,Lackcanary等工具定位后具体分析
- 实习过程中自己解决过的内存抖动情况
- 行业内常见的APP启动优化有哪些?
- 冷启动优化方向,延迟加载,延迟执行,主线程优化,异步执行
- GC优化(GC抑制,减少GC回收),锁优化等;
- LeakCanary的底层原理?
- Leakcanary 检测内存泄漏就是利用弱引用来检测被弱引用的对象是否被正常回收、释放
- 先使用ActivityWatcher等监听者去监听activity的生命周期,当onDestory() 时会交给ReachabilityWatcher去处理
- ReachabilityWatcher内部生成了 KeyedWeakReference 弱引用对象,内部持有者当前要追踪的对象,并且记录了当前的时间,key(指向绑定的对象)等信息。
- 初始化 KeyedWeakReference 时,构造函数中还传入了 queue ,而这样的目的是为了再进行一遍对象是否回收的check 。并使用 Handler 延迟5s后再去检测该对象是否真的被回收。
- 当我们弱引用中所持有的对象被回收时,即相当于我们弱引用本身也没有用了,Java会将我们当前的弱引用对象,添加到我们所传递的队列(queue)中去。
- 如果队列中存在,则证明对象已经被回收,否则即存在泄漏的风险(没有的话手动走一遍GC之后再次监测)。
- Java引用类型有哪些?
- 一共有四种引用类型,分别是强引用、软引用、弱引用和虚引用
- 强引用指向的对象是强可达的,而其他引用指向的对象都是弱可达的。当一个对象存在到 GC Root 的引用链时,该对象被认为是强可达的。
- 只有强可达的对象才会认为是存活的对象,才能保证在垃圾收集的过程中不会被回收;
- 强引用:只要存在强引用,垃圾收集器就不会回收该对象;软引用:当堆内存不足时,垃圾收集器会优先回收软引用指向的对象;弱引用:指向的对象无论在内存是否充足的时候,都会被垃圾收集器下次回收;虚引用:主要的作用是提供了一个感知对象被垃圾回收的机制;
- LeakCanary 为什么不是虚引用?
- 虚引用必须和引用队列 ReferenceQueue 联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。就不能通过虚引用来获取到原对象的信息。
- 项目相关:如何解决内存抖动和硬件适配的工作
记不得有没有手撕了,好像是没有手撕的部分