六战六捷之我的面试心得

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

自我介绍

一般面试官都会让你自我介绍,我觉得自我介绍主要是有两个作用

第一个是给面试官留出时间来看你的简历,他好想一下问你什么问题比较好

第二个就是面试官想听一下你的表达是否存在问题

一般而言建议自我介绍最好提前写好,先过几遍,让脑袋里面有一个大概。时间就控制在三分钟左右就好了,太长背不了,太短面试官简历没看完。

附上我常用的自我介绍给大家参考

你好,我叫张三,先后呆过X家公司,已经有X年的Java开发经验,第一家公司是XXXXX,主要是做XXXX,我主要负责XXXX。第二家公司是做什么什么的,我主要负责什么,在最近做的一个项目里面,取得了某某成果.....

当然上面的内容肯定不够三分钟,所以请大家根据自己的实际情况进行适当扩充

八股文

这些问题呢,一般都是有迹可循,网上分享的面经也是一大堆,我主要是想和大家分享一些我印象比较深刻的八股文的题的思路。

讲讲ThreadLocal

我一听这个开场感觉就很稳,之前有写过ThreadLocal相关的内容。我直接一把梭,面试官久久无言。

首先讲下ThreadLocal底层数据结构,然后延伸到用法,由于子线程无法获取到父线程ThreadLocal的值,所以延伸到了 InheritableThreadLocal。

又因为在使用线程池的时候InheritableThreadLocal并不能解决获取父线程值的问题,因为线程池中的线程是复用的,可能在子线程中对值进行了修改,使子线程获取到的值并不正确。我又给引申到了 alibaba TransmittableThreadLocal,再顺便讲下它的原理。

最后讲下ThreadLocal可能会出现内存泄漏需要注意,又把怎么排查内存泄漏的方法讲了下。

讲完这些,面试官一般都不会再继续问了,因为我把他想说的都说了。

之前关于ThreadLocal的文章,可以看这里

你有没有被ThreadLocal坑过?


如果让你设计一个线程池,你怎么设计?

这其实就是说线程池的,只需要把线程池的核心原理讲下就行了。

先说线程池主要是通过ThreadPoolExecutor来创建的,再说下几个参数的作用,网上分析线程池的文章一大堆,面试的时候可不是写文章,一定要在有限时间说重点。

比如重点说下原理,主要是几个参数的作用,阻塞队列一定要用有界队列,拒绝策略有几个,默认的行为是什么,再讲讲特殊的策略CallerRunsPolicy(如果线程池未关闭,则交给调用线程池的线程执行)

最后还可以引申讲下Tomcat的线程池优先扩容到最大线程数,来不及处理的多余任务才会放入到队列中。

最后收个题,如果你设计,线程池的参数允许动态调整,线程池是提供了参数进行设置的。

关联文章

Tomcat线程池的骚操作

为什么阿里建议你不要使用Executors来创建线程池?


讲讲redis分布式锁

就要讲下setNX这个命令,然后说下有什么问题(比如业务未执行完成锁就释放了,或者释放锁的不是同一个线程等等问题),然后引申到redLock,再引申到 redission实现的分布式锁,重点讲下说下setnx+lua以及watchDog

然后还可以引申到 zookeeper实现分布式锁,说下有序节点,临时节点,事件监听等,一般是使用开源客户端curator的实现。

最后再比较下两者区别,比如

  1. redis获取不到锁会一直不断尝试获取,比较消耗性能
  2. redis数据并不是强一致性,极端情况下可能会出现问题,redlock也无法完全保证
  3. zk设计定位就是强一致性,锁模型健壮,适合做分布式锁
  4. zk获取不到锁,只需要添加监听器就行了,不用一直轮训

zk也有缺点,就是较多客户端频繁申请加锁,释放锁,对于zk集群的压力会比较大。

time_wait过多怎么办?

从四次挥手到怎么产生time_wait,再到多了会怎样?怎么解决。这就是一个顺序链条。

TCP连接处在 TIME_WAIT 状态,这个是TCP协议规定的,四次挥手时主动关闭方所处的 一个状态,会等待2个MSL(MSL=2分钟),所以在这个时间段内不会释放端口,如果并发量大的话,会导致端口不够用,从而影响新的TCP连接。

我们可以通过设置对应的系统参数(reuse_buckts,好像叫这个,参数为什么不写全?我写了也记不住,干脆只需要知道有参数可以控制就行了),重用这些连接。

tomcat调优怎么做?

可以从I/O模型,JVM内存,线程池以及网络优化四个方面答。

如果tomcat跑到windows上可以考虑使用NIO2,因为从操作系统层面实现了真正的异步IO,如果是在Linux服务器上,就还是建议使用NIO,因为JVM是在应用层面通过epoll实现的异步IO。

JVM内存就涉及到jvm内存模型(不是JMM),然后针对年轻代,老年代,metaspace等分别进行说明,以及一些配置的参数,垃圾回收器等。

网络优化的话可以从tcp的半连接队列和accept队列说起。

半连接队列:保存 SYN_RECV 状态的连接。

队列长度由net.ipv4.tcp_max_syn_backlog设置 

accept 队列:保存 ESTABLISHED 状态的连接。

队列长度为min(net.core.somaxconn,backlog)。其中 backlog 是我们创建 ServerSocket 时指定的参数,最终会传递给 listen 方法。backlog在tomcat中对应的是acceptCount的值。

acceptCount默认值是 100,net.core.somaxconn的默认值是 128。

你可以想象在高并发情况下当 Tomcat 来不及处理新的连接时,这些连接都被堆积在 accept 队列中,而acceptCount参数可以控制 accept 队列的长度,超过这个长度时,内核会向客户端发送RST,这样客户端会触发“Connection reset”异常

所以配置tomcat的时候我们需要考虑这两个参数的值

kafka exactly once如何保证?

at least once + 幂等 = exactly once,kafka可以保证at least once

Producer 的幂等性指的是当发送同一条消息时,数据在 Server 端只会被持久化一次,数据不丟不重,不过这里是有条件

  1. 只能保证 Producer 在单个会话内不丟不重
  2. 幂等性不能跨多个 Topic-Partition,只能保证单个 partition 内的幂等性,当涉及多个 Topic-Partition 时,这中间的状态并没有同步。配置 enable.idempotence 设置为 true

Producer 幂等性的实现原理,Kafka Producer 在实现时有以下两个重要机制:

  1. PID(Producer ID),用来标识每个 producer client
  2. sequence numbers,client 发送的每条消息都会带相应的 sequence number,Server 端就是根据这个值来判断数据是否重复

同时producer 在设置幂等性时,

要求 MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION 小于等于 5, 因为 server 端只会缓存最近 5 个 batch。

如果想要保证多个partition,则需要事务

mysql索引优化要注意哪些点?

先从mysql B+树结构(页)说起,然后讲讲注意点。比如

  1. 不要超过三张表join
  2. join的时候小表驱动大表
  3. 尽量走主键索引,避免回表
  4. 为区分度大的列建立索引
  5. 最左匹配原则,like 'xx%'
  6. 查询需要的列,而不是所有列,不要使用计算,函数等
  7. explain ..............

Synchronized和ReentrantLock有什么不一样

先说原理,再比较异同点。

Synchronized从偏向锁 ---> 轻量级锁 ---> 重量级锁  ---> CLH队列  ---> pthread

ReentrantLock ---> 用法  ---> 原理(AQS)  ---> UnSafe.park ---> pthread

还可以引申下AQS下的其他并发工具类

感兴趣的可以去看下我写的并发编程系列。

看了Synchronized源码,请别和我说它慢

这波对AbstractQueuedSynchronizer的解析,我给自己打99分!

SpringBean如何解决循环依赖?

我知道你要说三级缓存,说之前最好看下源码形成自己的思想,光背是背不住的。

然后面试官会问你只要两级行不行?如果你说不行,那面试到这里就结束了。

如果你说行,就好好想想问什么需要三级呢?(代理)

项目

  1. qps,rps多少?

  2. 线上遇到过让你觉得最有难度的问题?

  3. 如果你负责的项目流量陡增10倍怎么办?

  4. 你这个项目的亮点在哪里?

文字越少,问题越大。

说实话这些开放性问题问得比重是远比八股文大的,因为八股文网上一大堆,但是这些项目上相关的,每个人都是独一无二的。所以平常的时候要多思考这类问题,多总结。

以上就是常常被问最有代表性的问题,希望对大家有帮助。

回答不上来怎么办?

你觉得躺平怎么样?

有些问题回答不上来很正常,大家理解可能不一样,而且就算回答上来了,说不定也不是面试官想要的。

遇到不清楚意思的,多问问。实在不会的就回答不会好了,或者跟面试官讲讲你的思路也行,把这场面试当成一场技术交流,心态会好很多。

面试之前最好把一些常问的,做到心中有数

要自信呀

只要够自信,面试就成功了50%。

最后,看到这儿了,我的自信值得你点个赞吗?(手动狗头)


原文始发于微信公众号(think123):六战六捷之我的面试心得