阅读 377

面试经历

JDK相关

HashMap中的get方法(1.7与1.8的不同)

听到这个问题的时候,我是懵的。因为之前我只看这两个版本中的put相关比较,对于get方法实在是没有注意到,只好回答我不清楚有什么变化~。
个人看法===>事后我觉得应该是问这两个结构(1.8中增加了红黑树)以及当key实现了Comparable对查询有所提升这两方面。对于put方法中的变化可以查看下这篇文章HashMap中的不安全

线程池中的方法

这里也只是稍微提及了下线程池的种类以及线程池里面的shutdownNowshutdown的区别。
个人回答===>我就回答了第一个问题,例如FixedThreadPoolCachedThreadPool以及newSingleThreadExecutor等等。
答案补充===>今天查询了相关的资料。总结下来就是说:shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。而shutdownNow则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。

线程池逻辑

这里询问了下线程池的运行逻辑。
个人回答===>这里我就基于线程池的任务队列有界且核心线程数小于最大线程数的情况下进行说明:1.请求进入会被核心线程数去处理。2.当核心线程数不够的时候则会进入任务队列。3.当队列已满,且线程数小于最大线程数,则进行增加线程数去处理。4.当最大线程数已满,请求还是不断的进入则进入拒绝策略。

jdk内置连接工具

问了下jdk里面查看服务状态的几种工具。
个人回答===>我就说本地使用了jvisualvm或者jconsole。当然如果公司内部线上连接不了的话,是需要设置线上jdk里面的management什么相关(具体的暂且忘记了,后期补上).

JVM

CMS与G1

这里询问这两个的区别?我按照我脑袋里面模糊的记忆回答,结果第一句就回答错了。然后就说不曾细究过。
答案补充===> 这里我直接参考了掘金内的文章【金三银四】JVM虚拟机CMS和G1收集器详解 ,大家可以过去查看。

MQ

MQ事务

问了MQ如何确保事务一致以及日常A调用B以及C服务,如何确保事务一致?这里回答的不好,大家可以参考下基于RocketMQ的分布式事务解决方案去了解下如何保证事务一致的。
个人回答===>A调用B以及C服务(不谈第三方分布式框架TCC等),我的回答的远程调用失败再进行MQ进行补偿,保证事务的一致性,各位大佬有好的想法欢迎点评。

MYSQL

数据库间隙锁以及死锁

问是否了解过间隙锁?同样靠着脑袋里面的模糊的记忆回答,然后也是回答错误。至于数据库的死锁问题,我未曾遇到过也没对其详细的了解,然后就跳过。
答案补充===> 通过MYSQL(04)-间隙锁详解)可以知道间隙锁。通过【mysql】死锁-产生原因和解决方法可以了解死锁相关内容。

Mysql实现大文本增加索引的话能够被哪些方式取代

询问了Mysql实现大文本增加索引的话能够被哪些方式取代?
个人回答===>我这边还真没有遇到过如此情景,只能硬着头皮顶上了。就说了下将大文本映射成为一个类似于hashcode的存在,然后在数据库里面建立这个字段的索引。
答案补充===>事后有了解到mysql中还存在一个前缀索引,那么可以短暂的利用前缀索引完成目标(索引长度有限,如果字段过长则不会为全部的字段建立索引)。

Mysql建议varchar长度最大多大建立索引

询问了mysql建议varchar长度最大多大建立索引?
个人回答===>日常不了解mysql系列啊,只知道叶子节点的大小,然后后面我就没啥想法了(⊙o⊙)…
答案补充===>事后查询了相关的资料--->mysql索引长度的一些限制

Mysql中的explain分析语句

问了平时使用了explain看什么?
个人回答===>我就简单说了下平时用这个查看的有typekeys以及最后的where三列。其他的很少去查看。不过面试官提醒了我有没有查看过rows。我是没注意到过这个有什么不同的,有大佬知道的话可以点评下(除去查询知道结果集的大小之外,还可以查看出什么信息)。

B+树与B-树与B树

简单的询问下他们的区别 个人回答===>当然就说出来了,毕竟这都很重要的数据结构了(描述太多的,你们看文档就好)。
答案补充===>MySQL知识点总结(重点分析事务)这篇文章里面有介绍对应的比较以及其他方面。接触mysql则接触最多的就是操作系统。

Mysql查询回表

简单的介绍下查询回表是怎么回事? 个人回答===> 这块也是面试中的重点,以及5.6之后的索引下推。我这边也是讲解了原因,小伙伴们只要了解里面的数据结构就知道这道问题的答案了。

Redis

Redis基于Lua实现的分布式锁

问是否有了解过Redis基于Lua实现分布式锁?
个人回答===>我这边直接回答不了解。然后我说了下基于springBoot里面的redisTemple的实现。当然注意锁的几个重点,时效性,可重入,某个线程标识等等。
额外拓展===> 通过面试官:你会几种Redis分布式锁?我会三种!可以了解到redis实现分布式锁的几个方式,当然分布式锁不仅仅局限于redis,还可以有Mysql以及Zookeeper的实现,感兴趣的小伙伴可以去查看下相关资料。

Redis实现计数器

问是否有了解过Redis实现的计数器的功能?
个人回答===>我这边直接回答不了解(事后了解到原来redis里面的计数器就是incr以及decr,这个就叫做计数器功能(⊙o⊙)…)。
答案补充===> 通过Redis 多方式实现计数器功能(附代码)可以了解到redis实现计数器的几种方式,当然实现计数器是很好实现的,但是有一点需要加上前置条件,是否实现了有效数据的计数器,主要预防外来数据的攻击或者是大幅度的使用了公司资源。

Redis实现限流

问是否有了解过Redis实现的限流功能?
个人回答===>没错-我这边直接回答不了解,目前还没有玩过redis的限流功能,只了解过限流的几种方式处理-令牌,漏桶等等。
答案补充===> 通过基于Redis实现分布式应用限流可以了解到redis实现限流功能。

分布式

分布式事务

问了下相关的分布式事务是否有了解?
个人回答===>我就说我只是知道分布式事务框架,对于里面原理等等还未了解过。我也很尴尬。。。可以看下分布式事务中常见的三种解决方案,里面介绍了TCC以及利用mq达到事务最终一致性。

框架

SpringBean初始化方法init

问了Bean的初始化方法?
个人回答===>这块可能我没怎么理解面试官的意思,我只是回答了init方法是在BeanPostProcessorpostProcessBeforeInitializationpostProcessAfterInitialization方法之间调用。

Mybatis的sql配置

问了mybatissql配置问题?
个人回答===>因为简历上有了解mybatis的技能,所以我就不知道了这个了。。。(毕设是基于mybatisPlus注解形式开发)。
答案补充===> 通过MyBatis配置动态SQL语句基础可以了解到相关的概念。

Hibernate与Mybatis的区别

询问了下这两个的区别? 个人回答===>我的回答就很简单,主要讲了这两个框架的侧重点,比如缓存、数据库类型更改之后哪个框架更好的衔接等。
答案补充===>小伙伴们去mybatis与hibernate区别这上面会详细的介绍了两者的区别。

线上问题相关

00M相关

这里的话只是稍微涉及了下,问导致OOM的相关原因有哪些?其他的就没再继续询问了。
个人回答===>我就是回答了日常接触到的永久代内存不足以及垃圾回收时间超长导致的OOM两种原因。大家也可以查看下OOM异常追踪 了解下如何分析日常的OOM处理。

服务问题

如何保证流水金额正常

还询问了日常支付调用第三方的时候如何确保用户支付金额正常以及流水正常,当不正常的时候如何做处理?
个人回答===>首先支付过程中,根据第三方回调接口进行用户支付金额,第三方金额以及当前系统中流水中金额的对比,不对则立即进行钉钉邮件等通知。其次有个轮询任务查找前一天的增量数据对比然后提醒,提醒之后加入到一个异常队列中进行保留,然后等待财务等等人核实。

总结

以上是我本次面试中遇到的大部分问题了,可能有些没想起来,以上有补充的欢迎小伙伴们在下方进行补充,该文档会持续补充~