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