某 Android 大牛 “凡尔赛”,Android-Camera 内存问题剖析
简答:解决三个问题。语序重拍,读时未同步,写时被修改。实现原理是基于读写栏栅处理 cpu 读写顺序,同时处理编译时候严格按照编码顺序处理。本质上是通过 c++的
atomic
实现的。
7.ui 优化
简答:优化 ui 层级,activityidleHandler 处理不重要事件,提前实例化 ui 到缓存池子,x2c 等,展开说。
8.内存优化与 LeakCanary 的源码?以及 LeakCanary 的缺点和如何解决。
简答:LeakCanary 本质上是注册监听了四大组件的生命周期,当生命周期销毁时候,通过一个弱引用包裹该 Activity/Fragment 等组件对象,并循环检测该对象是否销毁了。解决方案,可以通过 ReferenceQueue+虚引用。当 GC 时候会把这些引用对象添加到引用队列中,接着通过 ReferenceDeamon 守护线程把数据保存在 ReferenceQueue 静态变量中,在 ReferenceQueue 的 poll 可以拿到。
9.算法:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字(Leetcode 原题)。
字节 2 面
1.自我介绍,项目经历,项目上的优化项以及优化的原因
2.Rxjava 源码原理,以及项目中你是如何将 Rxjava 流进行复用。
简答:模仿 DisposeObserver,当 ObservableCreate 调用 onSubscribe 后就会关联从上流到下流的关系。并通过 cas 设置到当前执行包的全局变量中。当第二次使用同一个流调用 onSubscribe 关联再度关联,就会 dispose 当前的 rxjava 流。只需要处理这一步骤即可。
3.你项目中高度自定义了 DiskLRUCache。问 LRUCache 的实现?问 LinkedHashMap 的实现?问 DiskLruCache 的实现?问 Glide 中实现的 DiskLruCache 的运用。
4.Handler 的原理
5.
volatile
原理6.
synchronize
?锁的转化流程。
简答:偏向锁转化瘦锁(owner thread id 不一致且没上锁),瘦锁转化胖锁(64 次获取不到锁后)。
7.
ReentrantLock
?实现。
简答:由 AQS(AbstractQueuedSynchronizer)实现。
ReentrantLock
?分为公平锁和非公平锁。AQS 本质上是调用 acquire 时候为本线程添加到同步队列中,每一个线程代表一个 Node,在每个 Node 会自旋竞争同步队列中的状态。公平锁需要多一个判断,就是保证自己是头节点。
8.ui 优化,首屏渲染时机优化
9.启动优化,与 AlphaManager 的实现。
10.插桩的原理以及运用。
ASM
Javapoet
动态代理
11.LiveData 和 ViewModel 的源码实现
12.x2c 源码实现
13.DNS 原理
14.https 的原理
15.算法:判断一个字符串是否是回文串(注意保证原字符串不可改变,可用 O(n)的空间复杂度)。
方向:栈的考究。
字节 3 面 Leader 面
1.工作软技能的考核,以及团队中的定位
2.如何进行 io 优化,指标是什么,优化后的结果以及参数是多少?
方向:可以使用
/proc/pid/stat
读取 cpu 的 idle,iowait 等。使用 mmap 优化后的结果。
3.算法:在一个单链表中,每 k 个节点进行反转,无法被反转的部分放在末尾。
腾讯面试
腾讯的面试风格,普遍是基于你的简历上项目经历,往细节往深处问。我是面试因算法失败了一次,后面第二次就成功了。
总结一下 2 次腾讯面试
腾讯第一次面试 1 面
1.自我介绍,项目经历,项目上的优化项以及原因
2.ARouter 源码实现,项目中对 ARouter 的扩展实现详细设计
3.ui 优化,启动优化,首屏展示时机优化
4.
volidate
?实现5.Java 异常捕获
13.DNS 原理
14.https 的原理
6.jni 中 JNIEnv 和线程的关系
简答:线程私有,需要 JavaVm 重新获取一个 jnienv 调用 attachThread 方法把线程和新的 JNIEnv 绑定起来。
7.jni 中有几种注册 native 方法。
简答:2 种,动态和静态
8.Native 异常捕获
简答:通过
sigaction
保存系统默认的处理信号方式,sigaddset
?保证一次只关心一种信号,sigaction
?设置自定义的信号处理方法。在自定义的信号处理方法中,进行 unwind_backtrace 处理,通过_Unwind_GetIP
获得 native 栈信息保存起来,并抛出异常。同时 当前方法地址 和 so 的地址获取 相对地址,最后通过 addr2line 解析 出是 so 库中哪一个方法。
腾讯第一次面试 2 面
1.自我介绍,项目经历,项目上的优化项以及原因
2.ARouter 的实现,以及自定义扩展 ARouter 的实现
3.项目中的 io 优化,以及为什么用 mmap 于 io 优化
4.mmap 的实现
5.mmkv 中 对应 mmap 断电时候的处理机制
6.mmap 没调用 msync 时候,落盘时机。
简答:进程死亡
6.算法:合并三个单链表(可参考 leetcode 合并多个单链表)
因为自己画蛇添足,把每一个节点拷贝了一次,还没有往后迭代,实在是错漏百出就挂了。脑袋还是不够清醒,结果饮恨而归。
腾讯第二次面试 1 面
1.自我介绍,项目经历,项目上的优化项以及原因
2.ARouter 的实现,以及扩展的实现
3.启动优化,以及 ARouter 的启动优化方式,ARouter 的分区方式
4.Navigation 的源码解析
5.基于 Navigation 编写路由框架 NavigationRouter 的源码实现,以及实现的优点
6.Navigation 实现的路由框架中如何处理 Activity 和 Fragment 嵌套启动的方式
7.class 的加载流程
8.Handler 的实现
最好能回答到 epoll 和 eventfd 的层面
9.实现一个多线程下的消费者生产者模式
腾讯第二次面试 2 面
1.自我介绍,项目经历,项目上的优化项以及原因
io 优化 与 使用
mmap
的优势和缺点3.ARouter 的实现,以及扩展的实现
4.多进程实现的路由
5.如何进行多进程的同步调用,此时另一个进程还没有启动?
6.数据结构中不支持多线程的数据结构,如果使用多线程操作会造成什么结构
简答:如
HashMap
,ArrayMap
等不支持多线程保护原子性的数据结构。每一次进行 put,get 操作的时候,都会对 modCount 加一。用于记录当前操作次数。一旦看是遍历里面的元素,会不断检查该操作前保存的 modCount 是否和之前的一致。不一致则抛出ConcurrentModificationException
7.
ArrayMap
?实现
简答:
ArrayMap
?是内存优化的数据结构。核心是由两个数组组成的数据结构。第一个数组记录了 key 对应的 hashCode,这个过程会不断的通过二分法找到 hashCode 合适的插入位置。获得的 index,index 左移动 1 位是 key 缓存的位置,index 左移动 1 位加 1 则是 value 的缓存位置。
ArrayMap
中的存在一个静态数组,用来保存大小 4/8 开辟过的ArrayMap
。如果使用该大小的 ArrayMap 则直接使用缓存。
ArrayMap
的扩容,当存储的数据大小大于等于 hash 存储的数组大小则扩容,小于 4 扩容位 4,大于 4 小于 8 扩容成 8,如果大于 8 则扩容成原来的 1.5 倍。
每一次 remove 发现是存储的数据是当前容器大小的 1/3,则压缩一半。
8.
HashMap
?与?ArrayMap
比较,两者的优缺点
简答:
数据结构上:
ArrayMap 是两个数组组成的是为了内存优化而生;
HashMap 采用数组+链表+红黑树
内存优化:
ArrayMap 更加节省内存,因为是一个内存中连续开辟的数组,不易产生内存碎片
HashMap 以 entry 的方式保存 key 和 value,对内存的利用率低
性能上:
Arraymap 查找时间是 O(logN) 级别(二分法),删除和增加成员需要移动成员,速度慢,小于 1000 的情况下没有区别
HashMap 增删的时间复杂度就是 O(1)
缓存机制:
ArrayMap 针对大小 4 和 8 的都有缓存。避免频繁 GC,两个缓存池的大小上线为 10
扩容机制:
ArrayMap 是在容量满的时机触发容量扩大至原来的 1.5 倍,在容量不足 1/3 时触发内存收缩至原来的 0.5 倍,更节省的内存扩容机制
HashMap 是在容量的 0.75 倍时触发容量扩大至原来的 2 倍,且没有内存收缩机制。
9.handler 的原理
10.handler 是怎么进行 postDelay 延时操作。
简答:postDelay 会将延时+当前的时间戳,插入到 MessageQueue 的合适位置。每一次消费判断时间到达延时的时间点,再进行消费。
11.当 handler 只有一个延时的 message 时候,Looper 中是如何运行。
简答:通过 pollOnce 调用 epoll 进行阻塞。
12.
volidate
?原理13.当没有添加
volidate
?修饰属性的时候,数据什么时候从缓存行刷新到主存。
简答:当从
synchronized
?代码域离开的时候;当线程结束时候;当调用synchronized
?方法;当第一次访问线程的某个属性。
14.算法题:在一个 n*n 的方格中。有两种方格,1 代表阻
塞不能经过,0 代表可达。两点坐标,a 和 b。问 a 到 b 的最短路径。
腾讯第二次面试 3 面和 4 面
腾讯 3 面和 4 面是联系到一起的,这里一起说了
1.自我介绍,项目经历,项目上的优化项以及原因
2.
mmap
?实现原理和 io 优化3.View 的绘制流程,从?
setContentView
?解析 xml 到 View 的绘制结束。4.硬件渲染流程
5.SurfaceFlinger 在 View 绘制流程中扮演的角色
Choregrapher 的工作原理
7.OOM 如何优化,内存爆满是虚拟内存容易先爆掉还是物理内存容易,一口气映射 4g 的内存是否会发生异常。
8.Bitmap 如何优化避免 OOM,为什么放在 native 中 bitmap 不容易 OOM
9.一个进程最多可以使用多少 fd
10.你研究过 RN 和 Flutter,RN 的渲染机制和 Flutter 的渲染机制是如何运作的?他们之间区别是什么?
11.插件化你是如何实现的。
12.算法 1: 将一个 int 的数字转化成汉语说法。如 10000 转化为一万。
简答:方向是除余,除法移动 int,并保存到栈中。然后推出,生成汉语说法
13.算法 2:中国下棋的马,能否吃掉另一个坐标的旗子,请找出坐标
简答:广度优先算法,遍历 8 个方向。
腾讯二次面试 5 面
本次面试是两个面试官进行考察,考察的东西偏向网络协议。
1.自我介绍,项目经历,项目上的优化项以及自己开源在 GitHub 上项目的特点。
2.当遇到弱网络时候的优化
简答:1.HttpDns,并解释 DNS 的原理。2.QUIC 协议替换 TCP 协议,介绍 QUIC 的原理和 TCP 的区别。3.接口的适当合并,并结合项目的运用方案 1
3.当遇到弱网络时候,网络是如何进行文件重传
4.当遇到弱网络时候,手机连接上了 4g,但是没有数据流量时候,如何检测并恢复。
评论