Android面试总结
1、Handler是怎么实现的?
在主线程创建的时候会创建一个Looper,同时也会在在Looper内部创建一个消息队列。而在创键Handler的时候取出当前线程的Looper,并通过该Looper对象获得消息队列,然后Handler在子线程中通过MessageQueue.enqueueMessage在消息队列中添加一条Message。
通过Looper.loop() 开启消息循环不断轮询调用 MessageQueue.next(),取得对应的Message并且通过Handler.dispatchMessage传递给Handler,最终调用Handler.handlerMessage处理消息。
2、 Synchronized放在静态方法和非静态方法上的锁对象分别是什么?
静态方法的锁属于类, 一个类中所有加锁的静态方法共用该锁
非静态方法的锁属于对象, 一个对象中所有加锁的非静态方法共用, 和静态方法的锁不同而互不相干
加锁的方法的执行不会影响同一个类/对象中未加锁的方法的执行
3、说说JVM垃圾回收机制
垃圾判断算法:引用计数法、可达性分析法
垃圾回收算法:标记-清除算法、标记-整理算法、复制算法、分代收集算法
垃圾回收器:Serial 收集器、ParNew 收集器、Parallel Scavenge 收集器、Serial Old 收集器、Parallel Old 收集器、CMS收集器、G1 收集器
jvm垃圾回收机制的底层原理:
使用新生代老年代垃圾回收策略
年轻代:
当新的对象被分配到Eden区,发现内存空间不够,于是触发第一次GC,每经过一次GC回收,对象的年龄加一,垃圾回收器首先将Eden区中存活的对象复制到From区,然后清空Eden区的空间。From区中通过可达性分析法判断对象是否能被回收,这里采用mark-copy垃圾回收算法,给能被回收的对象打一个标记,然后把打了标记的对象复制到To区,清空From的空间。然后To区重复刚刚在From的过程,就这样经过一次次GC,对象在From区和To区之间不断移动,直到有对象的年龄达到一个阈值,pspu垃圾回收器默认是15,cms垃圾回收器默认是6,这个参数是可以自己设置的,然后将达到年龄的对象移入老年代空间。
老年代:
当有对象进入老年代,而老年代空间又不足时会触发FullGC,FullGC使用的算法是标记-整理算法。
4、讲讲tcp的三次握手和四次挥手
三次握手:
第一次握手:客户端发送第一个包,其中SYN标志位为1, ACK=0,发送顺序号sequence=X(随机int)。客户端进入SYN发送状态,等待服务器确认。
第二次握手:服务器收到这个包后发送第二个包,其中包SYN、ACK标志位为1,发送顺序号seq=Y(随机int),接收顺序号ACK=X+1,此时服务器进入SYN接收状态。
第三次握手:客户端收到服务器传来的包后,向服务器发送第三个包,SYN=0, ACK=1,接收顺序号ACK = Y+1,发送顺序号seq=X+1。此包发送完毕,客户端和服务器进入ESTABLISHED建立成功状态,完成三次握手。
四次挥手:
- 第一次挥手:主动关闭方发送第一个包,其中FIN标志位为1,发送顺序号seq为X。
- 第二次挥手:被动关闭方收到FIN包后发送第二个包,其中发送顺序号seq为Z,接收顺序号ack为X+1。
- 第三次挥手:被动关闭方再发送第三个包,其中FIN标志位为1,发送顺序号seq为Y,接收顺序号ack为X。
- 第四次挥手:主动关闭方发送第四个包,其中发送顺序号为X,接收顺序号为Y。至此,完成四次挥手。