美团-Java后端-平台技术部-一面凉经(复活赛)
上次处女面美团被拷打傻了,结果下周一被捞了有机会打复活赛,感谢好心面试官!可惜没复活成功哈哈哈,泡挂了呜。
第一次碰见面试官先详细自我介绍以及部门业务的,好感++
“那我先考察一些基础吧。哪一块是比较熟悉的?Java 相关的”,头一次碰到让我自己选熟悉的问,乐 今天准备主要在看 JVM 八股,于是说 JVM
JVM
- “堆里面主要存放什么对象?存放什么东西?”上来一句给我整懵了,“存放对象”“……嗯,我的问题”,两人都乐了,哈!
- “对象都在堆里吗?”——不会,这么问应该就是有反例,但确实不知道反例是啥,看太少太浅了。
- “栈里面存放什么?”——栈帧……
- “行,对象也有可能在栈里面存放”——布吉岛啊。“我们想象什么场景它会在栈里面存放,堆里面存放有什么缺点?”——懵
- “堆对象放多了会发生什么?”——OOM。“OOM 之前发生什么?”——GC
- “那对象都放堆里,GC 很频繁对吧?一些特定场景下,对象存活时间很短,引用很少,可能会放在栈里……减少堆压力减少 GC”——受教了
- “什么样的对象会放入老年代?”——年龄阈值 15;大对象。“别的情况?”——不知道了,查了下还有动态年龄判断和主动 GC - “为什么是 15?算了我一会问你,你也应该知道”——汗流浃背,只能想到以为是概率统计结论
- “什么情况会发生 Full GC?”——Minor GC 还不够,老年代要满
- “行,你 JVM 相关是在哪里学的?”——《深入理解 Java 虚拟机》,老圣经了。“那不应该看出来是这个结果吧哈哈?”——再次汗流浃背,说刚开始看还没看多少
- “其实这里有三种情况,还有个空间分配的担保机制”——只能附和对对对;查了下主动调用也行,元空间不够也行
- “G1 回收阶段什么时候 STW?”——除了并发标记以外都有
- “CMS 有什么缺点?”——标记清除的内存碎片;浮动垃圾(应该还有个清除时并发 CPU 资源抢占,降低程序吞吐量)
- “好像还有一个”——想不到了。“没关系,浮动垃圾你是不是没理解到位?”——“确实有些懵懂”,然后给我讲了讲浮动垃圾怎么回事,好人
“那我们再考察些别的,说说 TCP 和 UDP 的区别吧?”——汗流浃背,说最近没准备计网和 OS,学太早了忘了(这题能答深挖就扛不住,索性直接摊牌) “那我再考察些 Java 相关集合类,可以吧?”——呜,还问我意见,什么大好人,再拒绝也就不礼貌了(bushi)
Java 基础
- “老生常谈,HashMap,在 1.7 会发生死循环,什么情况下发生?”——扩容、头插法、循环链表,细节忘了
- “ConcurrentHashMap 1.7 怎么加锁的”——分段加锁,1.8 是锁链表头
- “1.8 再说详细些,比如 put()”——CAS 或 synchronized。“……可以再看看源码,里面有4 个 if-else,可能还有数组初始化……”,又讲好多,学习了
- “了解扩容原理吗?”——硬着头皮说了解过,硬扯 CopyOnWrite 搬石砸脚。“那我们不聊这个了,它支持多线程扩容你知道吗?……”然后认真跟我讲了扩容机制,根据 CPU 核数算出来合适线程数之类的(后来看源码确实是这样,之前真没注意),学到了
- “synchronized 锁升级过程了解吗?”——说意向锁被 JDK 15 被废除了,所以基本上只剩轻量级升重量级了(想以此逃避细节拷打)
- “锁标识存在哪里?”——Mark Word 对象头。“Mark Word 有多少位?”——32 位是吗?。“32 或 64,看操作系统”
- “4 个 bit 能表示多少数字?”——2^4=16
- "对象头里面有 4 位留给谁了你知道吗?"——?有点懵,确实没反应上来。“比如留给对象年龄,刚刚说的 15 就是这么来的”,牛蛙!记住了,确实也有印象对象头里有对象年龄 GC 用,这下串起来了,赞!然后又讲了讲对象头其他部分大概是什么
- “线程池的非核心线程是什么时候创建的?”——设置可以创建;阻塞队列已满
- “什么时候销毁?”——空闲时间超过存活时间 keepAliveTmie
- “处理完任务队列满了的额外任务等待 keepAliveTime 就销毁吗?”——觉得应该继续处理队列中的任务,肯定了,然后又细讲了讲机制
- “什么时候销毁?”——空闲时间超过存活时间 keepAliveTmie
“你还有哪块比较熟悉?”——最近也在看 MySQL 相关的东西 “OK 那就 MySQL”——大哥真洒脱随性真好啊!
MySQL
- “MySQL 底层索引用的什么数据结构?”——B+树
- “B+树和 b 树区别?”——老生常谈。“B+树叶子结点之间是什么数据结构?”——双向链表
- “隔离级别的可重复读是什么意思?”——举例 AB 事务布拉布拉
- “数据库这块还有哪比较熟?”——最近在看事务和锁。“锁是吧,行”
- “用 SQL 实现一个死锁,举个例子”——大概描述就是 AB 事务锁资源顺序导致死锁
- “具体 SQL 语句?”——select for update,结合 SQL 再具体描述了一下上面的过程(还好吸取了上次不会写SQL的经验教训,这些天看了看锁的SQL怎么实现,没有两次在同一个地方翻车就是进步就是win!)
30 min
算法
- LC 426(会员题,或剑指 LCR 155 免费同题) 二叉搜索树转排序双向链表
- 看了看,有点怂,没做过,感觉左孩子右孩子遍历改起来会自己绕进去,于是换题(哎,菜还得多练)
- LC 53 最大子数组和,看似 mid 实为 easy 的 dp,但是好久没做 dp 想着滑窗绕进去了……面试官提醒我考虑 dp,结果推状态转移方程还是考虑了滑窗的思想半天推不出来。面试官又提醒怎么考虑状态转移,我能听懂意思,也能写方程,但脑子里受滑窗影响觉得这个方程不对,然后又犹豫了会选择相信面试官直接敲代码,然后过了……我真傻,真的。甚至中途收集最大值我直接 return 了 dp 末尾,面试官又提醒我然后我才补上,巨尴尬
+15 min——45 min
反问
- 先问我“平常怎么学习的?”——网课、书、博客,后面打算研究源码(感觉以后不应该提课了,书+文档+博客+源码够够的了)
- 哪方面还要着重提高?——JVM 书看完;博客看全看详细;算法加强常见题得熟,没做过也得有思路
- 如果能去,技术栈准备?——实习生基础好就行,框架会用就行;基础扎实已经很耗费时间了,我们也没指望能一上来就深入框架源码(与牛友面经阿里上来就问看过 Spring 源码吗形成鲜明对比)
- “对,还有一点,希望你回答问题时能更自信一些,经常用“可能”“或者”,让我感觉你对你的回答不自信,即使是对的。我们搞程序的肯定是要严谨一些”——确实有点代入生活习惯,不喜欢把话说满,觉得不确定就直接查,面试没法查(bushi);但是有时也确实是不太确定答案习惯性带个可能,确实对于面试来说不是个好习惯,受教了!
52 min 结束
总结
2024-04-23
面试官很好,我没答上来的都跟我讲了,感觉快讲的比我还多了(笑);提的建议也都很中肯受用,算法题也没为难我只是我自己菜,哎。 23 周二晚上面,26 周五晚上没等到二面,也没挂,但估计是挂了,毕竟算法做太烂了。已经两次美团栽算法了,仍需努力! 后记:没捞,挂了,复活赛也没打赢,想你了牢大!(雾)
牛友们觉得有用的话,收藏同时顺便点点赞呗~谢谢!
#软件开发2024笔面经##美团#Kiro面经 文章被收录于专栏
Java后端,自己的面经整理总结