五面小红书全挂了嘻嘻😁
一面:
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的问题:
增加堆内存大小、优化对象创建、使用合适的垃圾回收器、对象生命周期管理、监控分析、定时检查内存泄漏
算法:子集
反问:大概介绍了十几分钟的业务情况(以为稳了,热情是你的谎言~ 一周后排序挂)
全部评论
(4) 回帖