OPPO一面电话面试总结

1.进程和线程的区别

2.java虚拟机内存结构

内存模型,Java虚拟机,
程序计数器(和线程共生,记录执行位置);
虚拟机栈(每个方法的执行都伴随着一个栈帧的入栈与出栈,主要组成部分编译期确定的局部变量表);
本地方法栈,和虚拟机栈类,只是这对应于native方法的;
堆,对象实例;
方法区,类信息,常量,静态方法。

3.广播的种类,LocalBroadcastManager实现原理;

a.普通广播,可跨进程发送,传输数据,android8.0以上针对静态注册的广播,需要加上接收者的包名,类名才可以接受到广播。
b.本地广播,只能本应用接收;
c.粘性广播,非即时性广播,可以缓存广播,有接受者注册监听了,就分发,android5.0已弃用,具体原因,接口文档没有说明;
d.有序广播,依次传递,中间可以拦截。

4.java的三大特性,封装,继承,多态。

5.重写和重载

重写,子类是可以提高方法的访问范围的,比如父类是protect,子类可以为public
从java5开始,可以把返回值修改为子类实例;

6.什么场景会出现只掉onPause,不调onStop

如:startActivity就不会,息屏会成对回调。

7.哪些场景会出现内存泄漏

a.Cursor,及IO操作,都是继承于Closeble接口,为了防止编程遗漏,建议使用java7新特性,try-with-resource方式初始化对象,会自动调Closeble.close()方法;
b.注册的广播没有注销本质上也是会产生内存泄漏,记得unregisteredBroadcast;
c.静态对象持有context;
d.防止匿名内部类持有外部activity;
e.需要手动释放资源的对象,没有及时释放,如bitmap;
f.定时任务,或者持续性任务,如:Hanlder里还有待执行的message,属性动画没有停止运行;

1.数据库更新,新增字段;

2.java三大特性,抽象,封装,多态,继承;

3.黏性广播;

4.内存泄露场景,cursor,注销广播,IO操作;

5.减少View层级关系,RelativeLayout,Mege,include,;

6.多结合具体的场景;

7.Error,Exception,Throwble;

8.Touch事件分发;

9.Handler MessageQure是共享的吗?message.target = handler.

10.LocalBroadcast实现原理;两Map积累注册信息,Handler回调结果到onRecevice()

11.内存模型,Java虚拟机

12.GC算法,

a.引用计数器算法,每次引用+1,无法解决嵌套引用;
b.可达性分析法,以GCRoot为节点,往下搜索,查看是否有引用;可做GC Roots的有:栈中的本地变量表、方法区的静态变量,常量引用,本地方法栈中的JNI引用对象。

引用又分为以下内容:
强引用
软引用,GC后内存不够,发生OutOfMemory之前,二次回收;
弱引用,GC,直接回收;
虚引用,GC直接回收,会发系统通知。

13.内存优化

a.频繁创建的对象,属性是否都是一样的,如果一样可以静态实例一个即可,如Glide里的RequestOptions, View里的Paint;
b.图片无损压缩,TinyPng




你可能感兴趣的:(OPPO一面电话面试总结)