JAVA面经复习(二十二)

面试难度:☆☆☆☆
声明:答案均为网上搜索汇总得到的参考答案,如有不妥或意见相左之处欢迎指出!

问:垃圾回收器介绍一下?

答:常见的垃圾回收器共有七种。可以划分为新生代和老年代的收集器。

新生代收集器

1、Serial收集器(串行收集器),该收集器属于单线程收集器,且在收集垃圾时,其余线程必须暂停工作(stop the world),其优势是简单高效。

2、ParNew收集器,是Serial收集器的多线程版本。

3、Parallel Scavenge收集器,类似ParNew,但更加关注吞吐量,其目标是达到一个可控制吞吐量的收集器。(吞吐量:CPU用于用户代码的时间/CPU总消耗时间的比值)

老年代收集器

4、CMS收集器(Concurrent Mark Sweep,并发标记清除)是一种以获取最短回收停顿时间为目标的收集器。适合应用在互联网站或者B/S系统的服务器上,这类应用尤其总是服务器的响应速度,希望系统停顿时间最短。其采用标记清楚法,在标记的时候可以和用户线程并发执行。从而减少了停顿,但是由于采用的是标记清除,因此难免会出现内存的碎片。

5、Serial Old是Serial收集器的老年代版本,使用“标记-整理”算法。

6、Parallel Old收集器属于Parallel Scavenge收集器的老年代版本。


7、G1收集器是当今收集器发展的最前沿成果之一,它的优点(1)充分利用并发和并行,加快了垃圾的回收处理。(2)分代收集,其不需要其余垃圾收集器进行配合就可以管理整个堆内存。(3)空间整合,G1算法从整体上看,基于标记整理算法,从局部上看是复制算法。两种算法都不会产生内存碎片,从而充分利用了空间。(4)可预测的停顿,用户可以设置对应的停顿时间,当超出停顿时间,就不再进行GC收集。其运作大致可划分为以下几个步骤:

1、初始标记(Initial Marking):仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS(Nest Top at Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可用的Region中创建新对象,这阶段需要停顿线程,但耗时很短。
2、并发标记(Concurrent Marking):从GC Roots开始对堆中对象进行可行性分析,找出存活的对象,这阶段耗时较长,但可以与用户线程并发执行。
3、最终标记(Final Marking):为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程Remember Set Logs里面,最终标记阶段需要把Remember Set Logs的数据合并到Remember Set中,这阶段需要停顿线程,但是可并行执行。
4、筛选回收(Live Data Counting and Evacuation):首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。此阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅提高收集效率。

问:GC的流程介绍一下?

答:首先是新生代如果空间不足,会触发MinorGC。在minorGC之前,会检查老年代的空间,如果开启了老年代空间担保机制,则会判断当前如果老年代中剩余空间大小,大于历次 Minor GC 之后剩余对象的大小,那就允许进行 Minor GC。如果在进行MinorGC后,新生代仍然放不下,则会放到老年代,老年代如果空间也不足,则进行fullGC。如果FullGC后仍然放不下,则报OOM错误。

问:JAVA中哪些类是线程安全的?

答:Vector,HashTable,ConcurrentHashMap。面试时候可以考虑拓展其中某个类进行讲解。

问:JAVA的IO模型?讲一下NIO?

答:1、BIO(Blocking IO)模型,指的是用户程序想要读取程序的时候,OS会阻塞等待数据准备好。当数据准备好了,OS会将数据从核心态拷贝到用户态,然后解除阻塞,数据的传输也就完成了。

2、NIO(Non-Blocking IO)模型,其实是采用轮询的方式代替了原有的阻塞等待数据的方式。但是在进行数据复制的时候,程序依旧会进入阻塞状态。

3、IO多路复用模型(IO multiplex),(类似时分复用等方式),通过采用多个channel对应少量的socket的方式,从而通过少量的socket就可以完成更多的连接,提高了client容量。

4、信号驱动IO(Signal driven IO),该IO模型在数据输入到OS的时候,不需要阻塞用户进程,等到数据输入完成后,OS发送信号给用户进程,用户再阻塞并将对应的数据拷贝完毕。

5、同步IO(Asynchronous IO),Asynchronous IO调用中是真正的无阻塞,其他IO model中多少会有点阻塞。程序发起read操作之后,立刻就可以开始去做其它的事。而在内核角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

问:Mysql的索引的数据结构?

答:B+树。

问:Redis有哪几种数据结构?

答:String,List,hash,Set,ZSet。

问:Redis的应用场景介绍一下?

答:热点数据的缓存,可以用redis保存一些常被搜索的热点数据;限时业务的运用,利用expire设置过期时间可以设置一些限时的业务。计数器相关,因为redis具有原子递增性,因此也可以用于高并发的秒杀活动等。

问:Redis主从复制,哨兵模式?

答:主从复制,即将主服务器的数据都复制到从的服务器中,从而让从服务器分担一部分主服务器的压力,复制的过程分为两种,一种是全部数据复制,redis将收到从服务的消息后,发送一份RDB的文件给从服务器,从而使得从服务同步主服务器的数据。另一种是部分数据的复制,主服务器收到从服务器的同步命令,如果是首次同步则发送RDB文件,否则发送部分非同步数据即可。

哨兵模式,是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

这里的哨兵有两个作用:

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

然而,一个哨兵可靠性明显不强,可以采用多哨兵的模式,即采用多个哨兵进程监控redis。只有当系统内一定数量的哨兵检测到数据不可用时,才认为系统宕机。

问:Spring和Springboot的区别?

答:springboot是在Spring框架上的进一步拓展,其主要简化了原有Spring中繁杂的XML配置的流程,简化了开发的过程。

参考资料:

Java垃圾收集器

Java虚拟机的7中垃圾收集器—Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1

Java 5种IO模型

redis常见应用场景

[Redis哨兵(Sentinel)模式](