六战六捷之我的面试心得
自我介绍
一般面试官都会让你自我介绍,我觉得自我介绍主要是有两个作用
第一个是给面试官留出时间来看你的简历,他好想一下问你什么问题比较好
第二个就是面试官想听一下你的表达是否存在问题
一般而言建议自我介绍最好提前写好,先过几遍,让脑袋里面有一个大概。时间就控制在三分钟左右就好了,太长背不了,太短面试官简历没看完。
附上我常用的自我介绍给大家参考
你好,我叫张三,先后呆过X家公司,已经有X年的Java开发经验,第一家公司是XXXXX,主要是做XXXX,我主要负责XXXX。第二家公司是做什么什么的,我主要负责什么,在最近做的一个项目里面,取得了某某成果.....
当然上面的内容肯定不够三分钟,所以请大家根据自己的实际情况进行适当扩充
八股文
这些问题呢,一般都是有迹可循,网上分享的面经也是一大堆,我主要是想和大家分享一些我印象比较深刻的八股文的题的思路。
讲讲ThreadLocal
我一听这个开场感觉就很稳,之前有写过ThreadLocal相关的内容。我直接一把梭,面试官久久无言。
首先讲下ThreadLocal底层数据结构,然后延伸到用法,由于子线程无法获取到父线程ThreadLocal的值,所以延伸到了 InheritableThreadLocal。
又因为在使用线程池的时候InheritableThreadLocal并不能解决获取父线程值的问题,因为线程池中的线程是复用的,可能在子线程中对值进行了修改,使子线程获取到的值并不正确。我又给引申到了 alibaba TransmittableThreadLocal,再顺便讲下它的原理。
最后讲下ThreadLocal可能会出现内存泄漏需要注意,又把怎么排查内存泄漏的方法讲了下。
讲完这些,面试官一般都不会再继续问了,因为我把他想说的都说了。
之前关于ThreadLocal的文章,可以看这里
如果让你设计一个线程池,你怎么设计?
这其实就是说线程池的,只需要把线程池的核心原理讲下就行了。
先说线程池主要是通过ThreadPoolExecutor来创建的,再说下几个参数的作用,网上分析线程池的文章一大堆,面试的时候可不是写文章,一定要在有限时间说重点。
比如重点说下原理,主要是几个参数的作用,阻塞队列一定要用有界队列,拒绝策略有几个,默认的行为是什么,再讲讲特殊的策略CallerRunsPolicy(如果线程池未关闭,则交给调用线程池的线程执行)
最后还可以引申讲下Tomcat的线程池优先扩容到最大线程数,来不及处理的多余任务才会放入到队列中。
最后收个题,如果你设计,线程池的参数允许动态调整,线程池是提供了参数进行设置的。
关联文章
讲讲redis分布式锁
就要讲下setNX这个命令,然后说下有什么问题(比如业务未执行完成锁就释放了,或者释放锁的不是同一个线程等等问题),然后引申到redLock,再引申到 redission实现的分布式锁,重点讲下说下setnx+lua以及watchDog
然后还可以引申到 zookeeper实现分布式锁,说下有序节点,临时节点,事件监听等,一般是使用开源客户端curator的实现。
最后再比较下两者区别,比如
redis获取不到锁会一直不断尝试获取,比较消耗性能 redis数据并不是强一致性,极端情况下可能会出现问题,redlock也无法完全保证 zk设计定位就是强一致性,锁模型健壮,适合做分布式锁 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 端只会被持久化一次,数据不丟不重,不过这里是有条件
只能保证 Producer 在单个会话内不丟不重 幂等性不能跨多个 Topic-Partition,只能保证单个 partition 内的幂等性,当涉及多个 Topic-Partition 时,这中间的状态并没有同步。配置 enable.idempotence 设置为 true
Producer 幂等性的实现原理,Kafka Producer 在实现时有以下两个重要机制:
PID(Producer ID),用来标识每个 producer client sequence numbers,client 发送的每条消息都会带相应的 sequence number,Server 端就是根据这个值来判断数据是否重复
同时producer 在设置幂等性时,
要求 MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION 小于等于 5, 因为 server 端只会缓存最近 5 个 batch。
如果想要保证多个partition,则需要事务
mysql索引优化要注意哪些点?
先从mysql B+树结构(页)说起,然后讲讲注意点。比如
不要超过三张表join join的时候小表驱动大表 尽量走主键索引,避免回表 为区分度大的列建立索引 最左匹配原则,like 'xx%' 查询需要的列,而不是所有列,不要使用计算,函数等 explain ..............
Synchronized和ReentrantLock有什么不一样
先说原理,再比较异同点。
Synchronized从偏向锁 ---> 轻量级锁 ---> 重量级锁 ---> CLH队列 ---> pthread
ReentrantLock ---> 用法 ---> 原理(AQS) ---> UnSafe.park ---> pthread
还可以引申下AQS下的其他并发工具类
感兴趣的可以去看下我写的并发编程系列。
这波对AbstractQueuedSynchronizer的解析,我给自己打99分!
SpringBean如何解决循环依赖?
我知道你要说三级缓存,说之前最好看下源码形成自己的思想,光背是背不住的。
然后面试官会问你只要两级行不行?如果你说不行,那面试到这里就结束了。
如果你说行,就好好想想问什么需要三级呢?(代理)
项目
qps,rps多少?
线上遇到过让你觉得最有难度的问题?
如果你负责的项目流量陡增10倍怎么办?
你这个项目的亮点在哪里?
文字越少,问题越大。
说实话这些开放性问题问得比重是远比八股文大的,因为八股文网上一大堆,但是这些项目上相关的,每个人都是独一无二的。所以平常的时候要多思考这类问题,多总结。
以上就是常常被问最有代表性的问题,希望对大家有帮助。
回答不上来怎么办?
你觉得躺平怎么样?
有些问题回答不上来很正常,大家理解可能不一样,而且就算回答上来了,说不定也不是面试官想要的。
遇到不清楚意思的,多问问。实在不会的就回答不会好了,或者跟面试官讲讲你的思路也行,把这场面试当成一场技术交流,心态会好很多。
面试之前最好把一些常问的,做到心中有数
要自信呀
只要够自信,面试就成功了50%。
最后,看到这儿了,我的自信值得你点个赞吗?(手动狗头)