光云科技一面面经
面经
写面经,攒人品
- 自我介绍
- 集合Hashmap
- 底层结构,版本
- 1.7与1.8的结构区别,其他区别
- ConcurrentHashmap与HashMap
- 结构,区别
- 不同版本的区别
- CAS是什么?
- 常用的jvm虚拟机
- jvm垃圾回收器
- 有那些常用的垃圾回收器
- CMS的垃圾回收过程
- 单例模式
- 有哪些写法
- 区别是什么
- 双检锁的优点?是完美的吗?
- 数据库索引?(聚簇索引、非聚簇索引;hash索引、B+树索引)
- B+树结构?
- 事务的隔离级别?作用?
- MVCC
- MVCC原理
- MVCC在不同的隔离级别的区别
- Spring
- 有什么特点,功能,ioc,aop,DI
- xml配置如何转成Bean
- Bean的实例化过程
- 循环依赖
- redis
- 分布式锁怎么实现的
- 有哪些数据结构
- rocketmq
- 消息消费失败怎么处理的(没处理,使用mq的原生的重发机制)(分为投递失败,业务处理失败)
- synchronized
- synchronized原理?
- synchronized加在方法上和代码块上的区别?生成的指令的区别?
- 反问
解答
集合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
Rocketmq
消息消费失败怎么处理?
消息消费失败可以分为两种方向,一种是mq进行消息投递失败,另一种是业务系统消费消息失败。
mq消息投递失败会将消息放入定时投递队列中,按照一定的时间间隔后进行消息重投。
业务系统可以将消息存储起来,对于失败的消息,通过定时处理的方式进行恢复。保存起来类似于消息幂等的处理方式。
Synchronized
Synchronized原理
底层采用monitor指令实现,会生成一条moniter enter和二条moniter exit(一条正常退出,另一条异常退出)指令实现。