拼多多问的比较难些,需要懂原理了。同时也考一些场景题,例如如何维护用户的登录状态比较节省空间,需要实际碰到过类似场景才行。一面面试官比较年轻,大部分都答出来了,但是在做算法时有点刁钻,一定要leetcode上的最佳答案,加上自己没做过这道题,结果给挂了。真是衰。。
今年找工作十分不易,市场候选人很多,能过就是钱给不到位!希望这篇面经能帮到大家~
用redis实现每个用户的登陆状态,bitmap
1mb,可以存储800w个用户的状态。getBit/setBit,https://segmentfault.com/a/1190000040177140
就是某个偏移,能设置0/1,不能设置其他的。一定是二值,省空间。
bitmap不是基本类型,底层其实借助的就是字符串来实现的(SDS),由于最大长度为512MB,所以最大偏移为2^32 - 1
CAS怎么实现的,有什么优点和缺点?
空轮询,浪费CPU,但是不用切换上下文,不是系统调用,成本很低。适用于并发比较低的场景。ABA问题。
两个用户修改数据,怎么防止另一个用户负载上一个用户的修改?
乐观锁,
加上版本号,或者把原来的状态放到条件里。
for update/lock in share mode
thread local
线程池有哪些参数?
核心线程数、最大线程数、最大线程数过期时间、阻塞队列、线程工厂、拒绝策略。
kafka是pull还是push,pull有什么问题?如何解决?
pull可能造成服务端压力过大,有很多空轮询,但是有个参数可以设置,类似长轮询。还有就是轮询时间太大的话,延迟会比较大。push可能无法知道下游的消费情况,造成过载,但是比较实时。
TMF是怎么实现的,有什么区别?
新生代为什么要有两个survivor,一个不行吗?
牺牲空间换时间,实现简单。新生代中最耗时的是复制。。。
用空间换时间,你可以模拟新生代回收两次的场景。假设现在只有一个s区,第一次,e满了之后,你把活得对象放到s,如果此时只有一个s区,那么当第二次e去满了之后,就没有s区可用了,为了使第二次GC能够进行所以在只有一个s取得情况下你只能,把s区中的或对象复制一遍放到e区,所以如果有一个s区的话,一次新生代GC要复制两次活对象。而在有两个的情况下,这个问题就可以避免了,e区满了之后进行第一次GC,把活的对象放入s0,此时s1区是没被使用的,当第二次GC的时候再把e区中活的对象和s0中活的对象一同放进s1,你有没有发现在一次GC中,两个s区会比一个s区少复制一次
覆盖loadClass方法。一种是设置线程类加载器。而不是用当前类所使用的类加载器。
为什么要有SPI,Dubbo SPI如何实现?
spi其实是java自带的扩展点实现思路,支持框架定义好api,然后在框架中加载业务实现类。如果实现类不在类路径中,可以通过线程类加载器加载到该类。
dubbo spi比java spi灵活。
dubbo spi支持按需加载实现类,而java spi会一次性加载所有实现累
dubbo spi支持注入其他spi,也就是依赖注入,更加灵活。而java spi不支持。
dubbo spi支持spring注入。而java spi不支持。
aop是怎么实现的,CGLIB和JDK proxy有什么区别?
hashTable和ConcurrentHashMap有什么区别?
编程:判断一个数字,是不是回文数,不断优化
这题其实是leetcode的基础题,但是面试官不断的要求优化,要的是leetcode上的标准答案,真的是折磨死。