写点什么

某 Android 大牛 “凡尔赛”,Android-Camera 内存问题剖析

用户头像
Android架构
关注
发布于: 1 小时前

简答:解决三个问题。语序重拍,读时未同步,写时被修改。实现原理是基于读写栏栅处理 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.数据结构中不支持多线程的数据结构,如果使用多线程操作会造成什么结构


简答:如HashMapArrayMap等不支持多线程保护原子性的数据结构。每一次进行 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 代表阻


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


塞不能经过,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,但是没有数据流量时候,如何检测并恢复。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
某 Android 大牛 “凡尔赛”,Android-Camera内存问题剖析