小红书-引擎架构- java实习-一&二面凉经

五面小红书全挂了嘻嘻😁

一面:

1.自我介绍

算法:反转单链表,递归写法怎么写,acm格式

2.解释下线程和进程的区别

3.static 和 const这两个的含义

4.java的垃圾回收机制

5.反问 感觉像KPI 就没问什么

二面:

1.自我介绍

2.就比如说是个交易系统,比如说我要给谁转账,你不能说失败了,就是我转给他钱,这个事是不能失败的,对吧?嗯,对的,即使失败了也要有这个兜底保障机制的,就我要能够保障这笔操作必然能成功。嗯,那这种我们是可能是什么样一种解决方案?

3.那你比如说现在你第一个任务失败了,第二个任务还失败了,你怎么知道他失败了两次?你怎么知道要重试两次。(说了增加计数器)

4.那我再延伸一下,你这里任务每次执行的参数都不一样,你这些参数放到哪里呢(说了抽象出上下文字段)

5.解答我的问题:这里其实你的想法还是维护一个任务失败的记录表,但是比如说我们扫表的过程中数据库压力满了,不是单单的任务的问题,这个时候你的兜底机制再去扫表,其实又是给他增加了一个性能的损耗,这种情况其实更适合,把一些失败的任务当作一个消息放到消息队列中,去消费这些失败的消息,这种做个解耦我觉得更好一点

6.聊一下这个excel导出的需求

7.你是怎么去发现这个内存溢出的问题的,怎么去定位到对应的代码中?

(这种排查相关的问题核心就是:问题发现-定位-解决)

发现的背景balabal -- 通过MAT去分析dump文件,发现XSSFWorkBook占用了大量内存,然后定位到代码中,发现POI用到了这个WorkBook去把所有的文件全部加载到了内存中,所以数据量大的情况下产生了OOM -- 解决:分批加载、同步转异步balabala

8.cpu飙高的这种问题你觉得可以怎么排查

(这种排查相关的问题核心就是:问题发现(背景)-定位-解决)

(1)定位高CPU占用进程:top命令找到对应的进程ID

(2)根据进程ID找到导致CPU飙高的线程:top -Hp <PID>

(3)将线程ID转化为16进制:printf "%x\n" <TID>

(4)获取线程堆栈信息:jstack <PID> | grep -A 10 <TID> (其实就是找到进程-线程堆栈信息,打印对应的前10行信息)

(5)根因分析(分析堆栈信息)(比如死循环、大量线程上下文切换、死锁、大量FullGC)

(6)代码优化

(7)方案验证

差不多是按照这样答的,但是面试官觉得jstack看不到具体的信息,说可以用火焰图和Arthas去看9.那可以怎么定位到代码中呢,其实可以用火焰图

火焰图可以定位到问题方法

10.阿里开源的阿尔萨斯知道吗

Arthas就高级了,可以debug去打断点,可以看到具体执行逻辑中数据的流动

11.说一个实习过程中对你来说最有技术成长的case

12.怎么去排查fullgc、yunggc的问题,怎么去避免fullgc的问题

如何排查频繁FullGC的问题:

(1)分析/监控GC日志:可以手动看日志,也可以通过一些可视化工具如GCViewer来监控GC情况

(2)JVM参数优化:在分析完日志后,可以适当修改堆内存大小,然后继续监控GC情况

(3)分析dump文件:如果参数优化完成后还是会有问题,说明是代码里面的问题,那这里跟OOM排查就基本上一样了,去分析dump文件看是代码哪里的问题,然后去解决

不一样的点在于,这里要多次dump做对比,最好在GC前跟GC后都做对比,因为如果你在GC后去分析dump,有的大对象已经被回收掉,可能就排查不到问题所在

避免fullgc的问题:

增加堆内存大小、优化对象创建、使用合适的垃圾回收器、对象生命周期管理、监控分析、定时检查内存泄漏

算法:子集

反问:大概介绍了十几分钟的业务情况(以为稳了,热情是你的谎言~ 一周后排序挂)

#面试问题记录#
面筋(烤面筋) 文章被收录于专栏

烤面筋~烤面筋~三元一串,五元两串

全部评论
兄弟们可以给我送点🌹🌹 不 让我做什么都行
1 回复 分享
发布于 08-15 18:27 山东
java有const吗。。
1 回复 分享
发布于 08-15 21:37 广东
uu第二个说的是MySQL持久化重试吗
点赞 回复 分享
发布于 08-18 09:28 广东
这么猛都挂了?好多我感觉我学了这么久都没听过
点赞 回复 分享
发布于 08-18 07:57 北京
没事替你体验了一下,打杂的,跑路了
点赞 回复 分享
发布于 08-17 19:23 北京
为啥问这么多jvm的
点赞 回复 分享
发布于 08-17 15:15 江苏
接好运
点赞 回复 分享
发布于 08-15 19:26 上海

相关推荐

数据库平台开发实习生&nbsp;-&nbsp;技术一面(算法太烂了,建个链表建半天,面试官等不住了,居然还用了c++语法,太招笑了)面试问题速览1.&nbsp;请做个自我介绍。2.&nbsp;能讲一下你实习项目中,分布式锁这块你是怎么实现的吗?3.&nbsp;讲一下你自学的&nbsp;Raft&nbsp;一致性算法。4.&nbsp;(追问)讲一下&nbsp;Raft&nbsp;的日志复制这块。5.&nbsp;你的&nbsp;AI&nbsp;项目里,RAG&nbsp;是怎么做的?向量数据库是怎么选型的?6.&nbsp;讲一下&nbsp;Function&nbsp;Calling&nbsp;的概念和应用。7.&nbsp;现场算法编程:删除链表的倒数第&nbsp;N&nbsp;个节点。(LeetCode&nbsp;19)我的回答策略与分析【针对问题】分布式锁的实现原理【回答策略】:我采用了“方案演进式”的回答方法。1.&nbsp;起点:从最基础的&nbsp;SETNX&nbsp;+&nbsp;EXPIRE&nbsp;方案讲起,这是最容易想到的起点。2.&nbsp;主动暴露问题:立刻指出该方案的缺陷,即两条命令非原子性,在极端情况下会导致死锁。这能体现出你思考的严谨性。3.&nbsp;方案升级:提出使用&nbsp;Redis&nbsp;2.6.12&nbsp;之后提供的原子性命令&nbsp;SET&nbsp;key&nbsp;value&nbsp;NX&nbsp;PX&nbsp;milliseconds&nbsp;来解决上述问题。4.&nbsp;再次深入:继续主动挖掘该方案的潜在问题,即“锁过期了但业务没执行完怎么办?”,引出更高级的“锁续期”概念。5.&nbsp;最终方案:最后点出&nbsp;Redisson&nbsp;等成熟框架是如何通过“看门狗(Watchdog)”机制来自动续期,保证业务执行期间锁的有效性。【回答分析】:这个回答策略的效果非常好。它向面试官展示的不仅仅是你“知道”分布式锁,更是你“理解”它背后的设计权衡和技术演进逻辑。这种结构化的、由浅入深的讲解方式,能清晰地展现出你的技术深度和体系化的知识结构,是面试中一个巨大的加分项。【针对问题】Raft&nbsp;共识算法的核心原理【回答策略】:我使用了“框架先行,细节填充”的策略来解释这个复杂的理论。1.&nbsp;理论破题:先用一句话的&nbsp;CAP&nbsp;理论来给&nbsp;Raft&nbsp;定位,表明它是一个保证一致性(C)和分区容错性(P)的系统,这能快速和面试官对齐上下文。2.&nbsp;结构化拆解:直接引用&nbsp;Raft&nbsp;论文的核心思想,即“将复杂问题拆解为三个子问题:领导者选举、日志复制、安全性”,为后续的讲解搭建清晰的框架。3.&nbsp;分点阐述:逐一讲解“领导者选举”(Follower&nbsp;-&gt;&nbsp;Candidate&nbsp;-&gt;&nbsp;Leader&nbsp;的状态转换、心跳、任期、投票过半)和“日志复制”(日志强制覆盖、复制到大多数节点才&nbsp;commit)的核心机制。【回答分析】:对于复杂的理论问题,最忌讳的是一上来就陷入细节。先搭框架再填充细节,能让你的讲解非常有条理,也方便面试官跟上你的思路。能够清晰阐述自学的底层理论,是展现学习能力和技术热情的绝佳机会。【针对问题】现场算法编程(复盘与反思)【回答策略】:我的第一反应是采用最稳妥的“两次遍历”解法:第一次遍历计算链表总长度&nbsp;L,从而确定要删除的是正数第&nbsp;L-n+1&nbsp;个节点;第二次遍历找到该节点的前一个节点,执行删除操作。【回答分析】:这个思路本身是完全正确的,能够解决问题。但在这次面试中,我最大的不足暴露在了编码的熟练度上。1.&nbsp;“辅助代码”耗时过长:我在“如何根据输入数组构建一个测试用的链表”这个环节卡了比较久,占用了宝贵的思考和编码时间。2.&nbsp;语法细节混淆:在紧张状态下,写出了&nbsp;int*&nbsp;这种非&nbsp;Java&nbsp;语法,说明对语言细节的肌肉记忆不够牢固。3.&nbsp;核心反思:这提醒我,平时刷题不能只停留在&nbsp;LeetCode&nbsp;网页上写核心函数。一定要在本地&nbsp;IDE&nbsp;里,进行从零开始的、包含数据结构定义和测试用例的“实战模拟”,才能真正提升现场编码的速度和准确率。对于“快慢指针”这种更优解法,也应当做到熟练掌握。
查看7道真题和解析
点赞 评论 收藏
分享
评论
14
73
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务