哔哩哔哩java面试题(一面):一位考生的吐槽与干货分享

兄弟们!前两天刚面完B站Java岗,今天来和大家分享下我的面试经历和准备经验!说实话,面完感觉整个人都不好了,面试官太强了,问题环环相扣,差点没绷住😂 不过收获也很大,赶紧整理出来给大家参考参考!

一、Java基础部分 - 看似简单坑不少

面试官一上来就问:“Java基本数据类型有哪些?它们的包装类分别是什么?”

我当时心想:这么简单?是不是在放水?结果回答完他来了一句:“那Integer a = 127和Integer b = 127比较,a==b返回什么?如果是Integer a = 200和Integer b = 200呢?”

// 真相:
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true

Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false,这里很多人答错了!

讲真,这个Integer缓存池的问题太经典了,-128到127之间的数会被缓存,超出范围就是新对象了。我差点就掉坑里了,还好前一天晚上刚好复习到了😅

HashMap那可真是B站面试的必考题!面试官问得特别细,我感觉他能把HashMap源码倒背如流!

我讲到JDK1.8中链表转红黑树的条件时,脑子一热说成"链表长度大于8就转红黑树",面试官立马抓住我:“确定只要大于8就转吗?”

我瞬间意识到自己说漏了关键条件,赶紧补充:“不对不对,是链表长度大于8并且数组长度大于等于64才会转,否则只会扩容!”

面试官微微一笑:“还有印象,很好。”(妈呀,差点凉凉!)

二、多线程与并发 - 面试官最爱的"送命题"

聊到线程池时,我刚开始背了一遍七个核心参数,面试官突然打断我:

“别背书了,你们项目中用的什么线程池参数?为什么这么设置?”

这下子我心里一慌…平时确实没怎么关注过具体参数的设置原因。不过还好我们团队技术负责人之前分享过一次,我就把他讲的理由搬出来了:

“我们订单系统用的是IO密集型任务,核心线程数设置为CPU核数2,最大线程数是核心线程数4,队列用的有界LinkedBlockingQueue,长度设为1000…”

面试官接着问:“如果订单量突然暴增超过处理能力,你们用的什么拒绝策略?为什么?”

我:“CallerRunsPolicy,让调用者线程自己执行任务。因为我们希望降速而不是直接丢弃请求或抛异常,这样虽然系统变慢但至少请求不会丢失…”

这回答好像挺对胃口的,面试官点点头继续下一个问题。

哦对了,线程池千万别说用Executors创建的!我同学就因为说用了Executors.newFixedThreadPool而被面试官"教育"了一顿,说这是阿里Java开发手册明确禁止的😂

三、JVM - 真·送命题

JVM是真正能看出你技术功底的地方,面试官开始问我:“最近有没有遇到过OOM问题?怎么解决的?”

老天爷啊!真是问到了痛处!上个月我们生产环境确实发生过一次内存泄漏,半夜被电话叫醒紧急处理。

我就把这次经历老老实实分享了:

“有次上线新功能后,系统运行几小时就OOM了。我们先用jmap dump了堆内存,然后用MAT分析,发现有大量的ConnectionHolder对象没被释放。排查代码发现是数据库连接没有正确关闭,try-finally块里漏了close语句。临时解决是回滚代码,彻底解决就是规范使用连接池和try-with-resources…”

面试官好像很满意我的"惨痛教训",笑着继续问了几个JVM调优的问题…

G1收集器我重点准备了一下,因为听说B站很多服务都在用。面试官果然问了:

“为什么从CMS迁移到G1?G1的优势在哪?”

我:“主要是为了降低延迟。CMS会产生浮动垃圾,Full GC时会STW,对我们的视频服务影响很大。G1的Region设计和可预测的停顿时间对用户体验更友好…”

四、Spring全家桶 - B站技术栈的日常

Spring部分面试官问得比较随意,但有个问题很有意思:

“说说你对Spring Bean生命周期的理解?”

我正要背那一堆步骤,突然想起面试官说的"别背书",于是换了个思路:

“这个问题我理解的重点是Spring提供了哪些扩展点让我们介入Bean的生命周期。比如实现InitializingBean接口或者用@PostConstruct注解,可以在Bean初始化后做一些操作。我们项目里就用@PostConstruct来初始化本地缓存…”

面试官笑了:“很好,聊点实际的。你们用Spring Boot多久了?遇到过什么坑吗?”

我直接说了实话:“去年迁移老项目到Boot 2.x时踩过坑,比如自动配置和我们的自定义配置冲突导致启动失败,排查了好久才发现是@ConditionalOnMissingBean的条件判断出了问题…”

五、微服务和分布式 - B站的基础设施

聊到微服务,面试官没问太多理论,而是直接问:

“你们的服务间调用怎么保证高可用?”

这个问题很实际!我说了我们项目中的实践:

“首先是服务注册发现用的Nacos,客户端用Feign+Sentinel做熔断降级。关键请求还会设置不同优先级,核心链路的超时时间会短一些,非核心链路可以适当放宽。熔断策略也是根据业务重要性区分设置的…”

分布式事务问题简直是B站面试的杀手锏!可能因为他们业务场景复杂吧。

当时我说我们用的是"可靠消息+最终一致性"的方案,面试官立刻抓住一个点:“如果消息发送成功,但是消费失败怎么办?”

我:“我们的消息中间件支持重试机制,如果多次重试还是失败,会进入死信队列,然后有专门的补偿任务定时扫描处理…”

面试官又问:“那如果是分布式锁失效导致的并发问题呢?”

这个问题确实有点难度,我承认我们项目中也遇到过类似问题:

“确实遇到过Redis分布式锁在网络抖动时提前释放的情况,后来我们引入了Redisson的红锁(RedLock)机制,同时在数据库层面增加了乐观锁作为最后的防线…”

六、B站特色问题 - 直击业务痛点

面试官突然话锋一转:“如果让你设计B站的播放量统计系统,怎么做?”

这个问题我还真想过(毕竟平时刷B站嘛),我分享了我的想法:

“播放量统计最大的挑战是高并发写入和准确性平衡问题。我会用缓存+异步写入的方式,比如用Redis计数器先累积,再定时聚合写入数据库。为了防止刷量,需要结合用户行为分析,比如同一用户短时间内的重复播放只计一次,IP+设备信息也要作为判断依据…”

面试官似乎对我的回答挺满意,接着问:“那弹幕系统呢?”

我说:“弹幕系统核心是实时性和承载能力。前端可以用Canvas绘制弹幕,通过WebSocket实现实时推送。后端的话,热门视频的弹幕压力很大,可以用消息队列做削峰,同时基于视频时间轴做分片存储,只加载当前时间段附近的弹幕数据…”

面试官笑着说:“看来你是我们的重度用户啊!”

总结与血泪教训

面试完整个人都虚脱了!B站的技术面试真不是盖的,从基础到架构,从理论到实践,问得特别全面。

给大家几点我的血泪教训:

  1. 千万别装懂! 不懂就是不懂,我有个问题答不上来直接承认了,反而聊起了我正在学习的方向,面试官好像更欣赏这种态度。

  2. 项目经验要有亮点! 不需要有多高大上的项目,但一定要能说出你解决过的实际问题和思考过程。

  3. 基础一定要扎实! HashMap、多线程、JVM这些老生常谈的东西每次都会考,而且会问得很深入。

  4. 要有自己的技术思考! 面试官很反感背书式的回答,他们更想听到你对技术的独立见解。

  5. 了解B站的业务场景! 提前想想视频网站可能会遇到哪些技术挑战,会加分不少。

啊对了,B站面试结束前还问了我最近关注的技术趋势…我提到了Java 17的新特性和Spring 6的变化,面试官好像挺意外我会关注这些。

总之,无论结果如何,这次面试让我学到了很多!希望我的分享对大家有帮助,如果有收获的话,点个赞呗!有什么问题也欢迎在评论区交流,毕竟大家一起进步才是真的!

想要获取更多面试真题,可关注我的公众号获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值