5月11日在上班时间,VIVO那边对我进行一轮电话面试,面试的主要内容如下:
1.简单的自我介绍
2.kafka的实现原理?
分区+按顺序写+按位移读
3.JVM垃圾回收的算法?
(1)标记-清除
标记出要回收的对象,清除掉要回收的对象
(2)标记-整理
标记出要回收的对象,清除掉要回收的对象,存活对象整理到连续的内存空间。
(3)标记-复制
标记出要回收的对象,复制存活的对象,缺点是内存使用率只有50%。
(3)分代收集
年轻代使用:标记-复制
老年代使用:
4.如何判断一个对象要被垃圾回收?GC Roots是怎么判断的?
根搜索方法是通过一些“GC Roots”对象作为起点,从这些节点开始往下搜索,搜索通过的路径成为引用链(Reference Chain),当一个对象没有被GC Roots的引用链连接的时候,说明这个对象是不可用的。
GC Roots对象包括:
a) 虚拟机栈(栈帧中的本地变量表)中的引用的对象。
b) 方法区域中的类静态属性引用的对象。
c) 方法区域中常量引用的对象。
d) 本地方法栈中JNI(Native方法)的引用的对象。
引用类型:强引用、软引用、弱引用和虚引用
5.垃圾回收器有哪些?有啥区别?
(1)Serial垃圾收集器
是一个单线程收集器,但它在执行垃圾收集的时候,其他线程得全部暂停工作。
(2)ParNew垃圾收集器
ParNew收集器是Serial收集器的多线程版本,它是多个线程在执行回收工作,但在执行回收工作时,其他所有线程也是要全部暂停工作的。以追求最短垃圾回收为主要目的。
(3)Parallel Scanvenge收集器
Parallel Scanvenge是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。这个垃圾收集器更关注吞吐量,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。它是多个线程在执行回收工作,但在执行回收工作时,其他所有线程也是要全部暂停工作的。
(4)CMS(Concurrent Mark Sweep)
CMS(Concurrent Mark Sweep)并发标记清除收集器是一种以获取最短回收停顿时间为目标的收集器,在JDK1.5中发布。会产生内存碎片。
整个过程分四个步骤。
1) 初始标记
2) 并发标记
3) 重新标记
4) 并发清除
其中初始标记和重新标记都是要停止其他所有线程的工作执行的,并发标记和并发清除可以与其他工作线程一起执行。
(5)G1收集器
G1(Garbage-First)收集器是整体上基于标记-整理,从局部看是基于复制算法实现。不会产生太多的内存碎片。利用多CPU、多核环境,通过并发的方式让JAVA程序在执行垃圾回收的时候也能继续执行。
G1收集器的过程如下。
(1) 初始标记
(2) 并发标记
(3) 最终标记
(4) 筛选回收
其中初始标记、最终标记和筛选回收是要停止其他所有线程的工作执行的,并发标记可以与其他工作线程一起执行。
6.垃圾回收器CMS的原理?
CMS(Concurrent Mark Sweep)并发标记清除收集器是一种以获取最短回收停顿时间为目标的收集器,在JDK1.5中发布。会产生内存碎片。
整个过程分四个步骤。
1) 初始标记
2) 并发标记
3) 重新标记
4) 并发清除
其中初始标记和重新标记都是要停止其他所有线程的工作执行的,并发标记和并发清除可以与其他工作线程一起执行。
https://www.sohu.com/a/214780788_753508
7.说下Synchronized和ReentrantLock的区别和实现原理?
(1)Synchronized在虚拟机实现,是阻塞的
1)同步方法
添加ACC_SYNCHRONIZED标识
2)同步代码块
反编译后得到monitor enter和monitor exit指令。
(2)ReentrantLock在代码层通过volatile+CAS实现,是非阻塞的
CAS 是通过调用循环调用compareAndSet来判断值是有修改,通过调用unsafe.compareAndSwapInt来实现,内部调用C++代码并且加锁(多处理器),通过offset读取内存中指定位置的数值,再跟当前高速缓存中的值比较是否