光云科技一面面经

面经

写面经,攒人品

  1. 自我介绍
  2. 集合Hashmap
    1. 底层结构,版本
    2. 1.7与1.8的结构区别,其他区别
  3. ConcurrentHashmap与HashMap
    1. 结构,区别
    2. 不同版本的区别
  4. CAS是什么?
  5. 常用的jvm虚拟机
  6. jvm垃圾回收器
    1. 有那些常用的垃圾回收器
    2. CMS的垃圾回收过程
  7. 单例模式
    1. 有哪些写法
    2. 区别是什么
    3. 双检锁的优点?是完美的吗?
  8. 数据库索引?(聚簇索引、非聚簇索引;hash索引、B+树索引)
  9. B+树结构?
  10. 事务的隔离级别?作用?
  11. MVCC
    1. MVCC原理
    2. MVCC在不同的隔离级别的区别
  12. Spring
    1. 有什么特点,功能,ioc,aop,DI
    2. xml配置如何转成Bean
    3. Bean的实例化过程
    4. 循环依赖
  13. redis
    1. 分布式锁怎么实现的
    2. 有哪些数据结构
  14. rocketmq
    1. 消息消费失败怎么处理的(没处理,使用mq的原生的重发机制)(分为投递失败,业务处理失败)
  15. synchronized
    1. synchronized原理?
    2. synchronized加在方法上和代码块上的区别?生成的指令的区别?
  16. 反问

解答

集合HashMap?

  jdk1.8中hashmap底层采用数组+链表+红黑树的结构;jdk1.7中hashmap底层采用数组+链表的结构。采用链地址法解决hashmap中的hash冲突问题,当链表长度达到8时进化为红黑树,节点数小于等于6时退化为链表。
  jdk1.7与jdk1.8中,数据结构发生了变化,链表的尾插法改成了头插法,尾插法在hashmap扩容时有可能造成死循环。

ConcurrentHashmap与Hashmap?

  ConcurrentHashmap是juc包中的类,是用于在多线程情况下的hashmap,解决了hashmap在多线程情况下并发不安全的问题。
  ConcurrentHashmap在1.7和1.8中采用了不同的结构和加锁方式。
  jdk1.7中采用了段(Segment)的设计,每一个段中都是一个Hashmap的结构,将很多个段组合起来就是ConcurrentHashmap的结构,1.7中保证并发安全采用了分段锁的机制,就是在段设计的基础上,对每一个段加悲观锁(syncronized)。
  jdk1.8中ConcurrentHashmap的数据结构采用了和Hashmap相同的数据结构,通过使用CAS操作来保证并发下的安全性。

CAS是什么?

  CAS就是比较并交换,全称Compare And Set,是一种原子性修改内存数据的一种策略。
  CAS操作过程是:会将内存中的数据与一个期望值进行比较,比较结果相等了,才会将内存中的值修改为要改成的值(一般在缓存)。
  java中很多地方都用到了CAS,比如AQS中就是用CAS去修改值,ConcurrentHashmap中也用到了。

常用的JVM虚拟机?

  主要jvm虚拟机是Hotspot虚拟机,IBM有一款J9 JVM。

jvm的垃圾回收器?

单例模式

  单例模式共有8种写法。

  • 饿汉式-静态常量
  • 饿汉式-静态代码块
  • 懒汉式(默认线程不安全)
  • 懒汉式-同步方法
  • 懒汉式-同步代码块
  • 双重检查锁
  • 静态内部类
  • 枚举

数据库索引

B+树结构?

事务的隔离级别?作用?

MVCC

Spring

Spring特点,功能

  • 方便解耦,简化开发
  • 支持AOP编程,很容易实现权限拦截,运行期监控
  • 声明式事务支持,spring容器提供的功能
  • 方便集成各种优秀框架
  • 提供了众多工具类,简化API使用难度
  • 的DI机制降低了业务对象替换的复杂性

XML配置如何转换为Bean

Bean的实例化过程

循环依赖

Redis

redis分布式锁是怎么实现的?

redis的数据结构

  redis中共有8种数据结构,其中常用的有5种。

  • 字符串 string

  • 散列-hash

  • 列表-list

  • 集合-set

  • 有序集合-zset

  • 位图-bitmap

  • 地理位置-geospatial

  • hyperloglog

  • redis中的数据结构

Rocketmq

消息消费失败怎么处理?

  消息消费失败可以分为两种方向,一种是mq进行消息投递失败,另一种是业务系统消费消息失败。
  mq消息投递失败会将消息放入定时投递队列中,按照一定的时间间隔后进行消息重投。
  业务系统可以将消息存储起来,对于失败的消息,通过定时处理的方式进行恢复。保存起来类似于消息幂等的处理方式。

Synchronized

Synchronized原理

  底层采用monitor指令实现,会生成一条moniter enter和二条moniter exit(一条正常退出,另一条异常退出)指令实现。

Synchronized加在方法上和代码块上的区别?生成的指令的区别?