思考题

1.java hashMap和redis map的rehash有什么区别?

Java hashMap rehash基于高低位链表,当前节点数组下标元素rehash不变或+旧的容量,存在线程安全问题和fail-fast 

redis字典中包含两个哈希表和trehashidx,当标识为-1代表未进行rehash,rehash过程是ht[0]表数据迁移到ht[1],整个hash的过程是渐进式rehash分多次执行完成防止因为某个槽key太多停止服务,在rehash的过程中删除,查找,更新等操作会在两个哈希表执行

2.java的线程池你们是怎么用的?原理是什么?怎么设置参数?有哪些状态?用了线程池有哪些问题?你们怎么解决的?Future是干嘛的

线程池工作原理,老师架构课画图讲过,下面这张图,边画边跟面试官讲

线程池状态:初始状态-->可运行状态-->运行状态-->休眠状态-->终止状态 ; 线程池问题:无界队列OOM(使用有界队列和备忘录),过饱问题:增加消费者或自定义拒绝策略降低消费者速率 ; future:对runnable或callable的执行结果处理

3.Java 的锁怎么实现的?有哪些?HashMap key可以为null,为什么ConcurrentHashMap key 不可以为null ?非公平锁怎么实现的?AQS每个Node里的节点状态是干嘛用的?

锁的实现基于aqs,常用ReentrantLock ReentrantReadWriteLock ; ConcurrentHashMap不能为null原因,无法去判断到底是key不存在还是value为null; 非公平锁基于cas实现 ;节点状态 CANCELLED:已取消调度 SIGNAL:唤醒后继节点 CONDITION:等待其他线程调用condition.signal()从等待队列到同步队列中获取锁 PROPAGATE:共享模式 前继节点不仅会唤醒后续节点

4.Synchronized  volatile 的作用?原理?怎么用?什么时候用?

synchronized原理图


volatile原理图


volatile常用场景优雅停机 注册中心服务实例心跳可见等,建议大家看下老师面试突击第三季并发部分内容,对上面这些关键字均有硬件级别的讲解

5.jvm结构?你们jvm的参数是怎么设置的?gc情况怎么样?怎么调优?我们项目的机器差不多每3天一次fullgc,GC已经不能再调优了,这个问题你有啥好的想法吗?

jvm结构:堆 虚拟机栈 本地虚拟机栈 程序计数器 元空间 ;参数设置新生代3G 1:1:8 老年代:1G ,gc情况大概几分钟到几十分钟一次minor gc 每次大概3-5ms左右,几小时一次full gc 每次不超过1s

jvm调优:策略:1.对象预留在新生代 2.大对象直接进入老年代 3.设置合理的对象年龄阀值; 3天full gc一次不能优化,当时没回答好说了一下升级为zgc,zgc推荐看一下美团技术团队分享文章

https://mp.weixin.qq.com/s/ag5u2EPObx7bZr7hkcrOTg

ps:CMS和G1问的比较多,大家面试准备的时候多看看

6.给你个sql,你说一下怎么创建索引?索引结构?联合索引为什么用要存储主键id,存主键id的内存地址不行吗?索引计划有哪些指标,你关注哪些指标?你了解mysql哪些锁?都是干嘛的?什么操作会有锁?需要注意什么?

根据具体的sql来创建索引,联合索引最左原则(字段不超过5个),索引个数5个以内 ; 索引结构:b+树叶子节点存储数据页 ; 如果存储地址值需要二次寻址 ;执行计划指标:select_type type 可能使用的索引 优化器实际使用索引等,主要关注连接类型type,索引使用情况和extra中内容 ; mysql锁:全局锁 表锁(显示锁和元数据锁MDL) 临界锁(间隙锁+行锁),锁注意事项主要还是死锁学会通过show engine innodb status来分析死锁案例 

7.redis你了解哪些?你工作什么场景用?底层数据结构有哪些?分布式锁怎么用?有哪些问题?你们怎么解决的?数据一致性你们怎么做的?分布式事务了解不?你们用过没?你们怎么用的?用了之后有啥问题?你们怎么解决的?redis如何可以动态扩容和缩容?如果你来设计,你怎么设计?

redis 数据结构类型 内存淘汰策略 过期策略 持久化rdb和aof  主从集群(哨兵高可用) 复制和redisCluster这些建议大家看一下《redis设计与实现》 ; 分布式锁:原生set nx ex+lua(get+del)或redisson hash结构支持可重入 或redLock或优化版本加上栅栏验证token ;数据库和缓存一致性推荐大家看一下老师早期出的亿级流量;分布式事务这里就直接引用老师gitee上的文章了

https://gitee.com/shishan100/Java-Interview-Advanced/blob/master/docs/distributed-system/distributed-transaction.md


8.MQ你们用的啥?什么业务场景使用?你是怎么考虑用MQ的?原理你知道多少?MQ有哪些问题需要注意?

这个老师讲的面试题突击第一季的时候讲了mq的连环炮。大家可以看一下。

9.你做过哪些项目?哪些是你主R的项目?对你技术挑战最的项目是哪个?挑战是啥?你是怎么解决的?你项目中哪些做得比较好?还有哪些可以优化?如果你现在负责一个项目,你要怎么推动实施?

这个就要根据个人情况来定,根据自己的项目和经历,把自己做的系统和业务弄透,然后再结合自己的项目多反问一下上面的问题。

10.面试官问,2020年6月18号,晚上18:00点,浏览器输入了jd.com,你把整个过程给我画个图,越详细越好

这个图取决你的薪资,这个是面试官原话

我的理解:这个问题,大家一看可能就是一道网络题,dns啊,加上一些网络包的层层封装,之前面试突击老师也讲过,但是这里有个日期就是6月18号,这个时间有点特殊,可能就会要考虑我们后端的一些东西,比如架构的东西,你就可以说一下,这个首页你要做你怎么做的,是不是用缓存啊,网关怎么走的啊,用什么缓存啊,用不用CDN啊,大家尽可能去发挥自己的架构能力,我就是按照这个思路回答的。


11.要做一个项目,全世界的人聊天app,现在一期只实现发送文字聊天,朋友列表,朋友圈,你给我画一下整个架构图。机器如何部署?

我的理解:聊天大概就是IM,获取朋友圈或者朋友列表,可以用http业务系统的架构来做,这里可能就是IM架构怎么设计,业务系统怎么设计,大概就是画一下这两个系统怎么设计,机器部署的话,因为是全世界,可能需要多机房部署,数据同步之类也要说说。我是按照这个思路回答的。

12.设计一个通用限流器,10、100、1000、10w、1000w的qps可以随意配置,误差率在99%

我的理解:在qps小于一定阈值的时候,可以用全局计数器来作为全局限流,如果qps高于一个阈值,就分配到每个机器上,本地做限流,定期汇报,然后重新分配。我大概就是按照这个思路讲的,限流算法大家也可以学习一下,比如令牌桶、计数器、滑动串口等,也可以参考一下sentinel的设计和架构。

13.设计一个点赞、评论系统,你怎么考虑?

我的理解:如果要求数据实时性比较高的话,可以通过一些flink实时计算来进行统计,如果实时性要求不高,可以本地缓存一下,定期更新,大概就是按照这个思路回答的。

14.现在有一个需求,本来不是你们组负责,但是由于一些其他原因,这个功能要由你们组来负责,你是怎么考虑的?

其实这个问题我感觉不太好回答,当时我是这么回答的,作为一下参考,我说如果这个需求比较急的话,我们可以先做,如果以后有关于这个需求的更新迭代,可以慢慢移植到其他组,自己做业务闭环,好维护。

15.MQ延迟队列你知道多少?你能设计一下吗?你能设计一个支持事务的MQ的功能吗?

这个大家可以参考一下rocketmq的说一下延迟队列是怎么做的。事务的话可以参考一下kafka是怎么设计的。

16.我们组内用一个新的技术组件,但是其他部门没有在使用,如果要推广,你有啥想法?

当时我是这么回答的,作为一下参考,可以把我的新技术组件写个好点的wiki,然后分享一下,看看那个部门需要这个功能,然后一个一个的部门的推。

17.你下一份工作你有什么预期?你对加班的看法?

这个你参考一下你面试的业务和公司,最好说自己的预期和你面试的公司业务和技术匹配度高一些,你面试的是订单组,你说你预期希望做财务系统,这个就不太好了。加班的看法,我感觉最好是说适当加班没有问题,先拿offer再说,拿到offer综合评估加班的情况。

备注:可能大家都能感觉到了,如果问你技术或者项目问题,如果你说不太了解或者说没有做过,那么下面就接着会问,如果是你,你怎么设计怎么解决?大部分都是这个套路,所以大家要多学习基础的原理,项目要搞透。

你可能感兴趣的:(思考题)