说实话,能有机会面一下阿里对我来说帮助确实有蛮多,至少让我知道了自己的不足在哪,都说面试造火箭,上班拧螺丝。但就算是如此,为了生存,你也只有不停的学习,唯有光头,才能更强。哈哈
2月28日在Boss上,有个阿里的大佬找我打招呼说可以帮我内推,我想也没想就把简历给它了,然后就一直忘记这事了。因为我觉得我一个垃圾学校的小垃圾,怎么会有面试机会,亏人家还让我预备一下,我也抛到九霄云外了。
然后也收到了阿里的内推消息
然后在3月4号的晚上8点钟(看来阿里的工作时间确实长,我估计面试也是他们kpi的一部分吧),一个来自杭州的生疏电话打过来
xxx,你好,我是杭州阿里巴巴xxx的,我想问你现在有没有时间,我来简单的给你做个面试,你这边先来个自我介绍
当时我还没意识到是内推,因为我早已经忘的差不多了,还以为是啥新的炸骗方式,直到他说它是来给我面试的,然后说有人内推过我的简历,我这才想起几天前的事情。然后我巴拉巴拉的做了一个传统的自我介绍,就是那些套路,之类的,然后面试官开始问问题了
你对多线程了解吗,说说你对Synchronized和lock,说说他们之间的区别
其实这个问题,应该算是很基础的问题了,我就说了一下,一个乐观锁,一个是悲观锁,然后说了一下Synchronized的锁升级的过程(这个还行我自己觉得),然后我说了一下Synchronized锁方法,静态方法,同步代码块的一些区别(这个点其实我没答上来,有点忘记了。就是在JVM里面的标记位不同的区别),然后是lock这点我也没答上,这个应该说他的几个实现,然后跟面试官聊聊他的底层实现原理,但是我这个是目前真的不是很熟悉,因为平时不用,可能前面走马观花的看了,但是这次面试是突击,所以真的对于lock就是知道他是aqs实现的具体的全忘记了
然后面试官说lock不熟,没事,那你还有没有用过什么东西来保证线程安全
然后忽然想到了一下CAS,然后说了一下CAS,这个我感觉说的7788吧,至少怎么保证安全的我说出来,先在本地线程记录原来的值和计算之后的值,去刷到主存的时候,先比较原来的值。但是他让我说底层原来的时候,我又似乎说错了,我把他和voliate搞混了,我竟然说是因为有一个内存总线,真的是尴尬呀,能够说让其他的本地线程无效,在Cpu层面(这就是那种靠背的结果,哎),其实CAS的底层是一个lock指令来实现的再多核系统中,反正就这样扯。。被我扯到了分布式锁。。。我感觉自己拉开话题的技术还是可以的,哈哈
你说你们公司用的redisson来实现分布式锁,假如不用redisson你能实现分布式锁嘛,自己用redis,或者你给我说说redission是怎么实现分布式锁的
当时我就在想,我怎么把自己从一个坑,挖到另外一个坑,因为redisson的底层源码,我是真的没看,这个我是真说不出来,然后我就说怎么实现分布式锁,用exist和setNX命令,还有加超时时间,然后用lua脚本做成一个原子性操作,来实现一个分布式锁,这个我以前自己做过demo,然后现在手写不出来,但是至少做过,印象还是深点。然后我就搭了一下,然后他又说,那你还有什么方法保证原子性呢?我其实也不清楚他想问的是啥,我就随便搭了个事务。。。。
我看你对redis蛮熟悉的,那我们就来聊聊redis,说说他的数据结构
我靠,终于来了个会的了,哔哩吧啦的说了一下,然后他又问了一些基础的东西,比如说缓存穿透这些,这些其实还好,究竟自己有试过。
既然你对redis那么熟悉,你知道为啥redis那么快嘛
其实这个问题是为后面做铺垫的,我搭单线程内存IO多路复用,妈的这个IO多路复用我只是以前看书的时候看过,我根本还不是很熟悉这个东西,然后他就盯着这个问了。。。然后我就尴尬的一批。就没问我了,可能知道了我的深度了吧,哈哈
那你对多线程方面的知识,还有哪些了解的,比如线程池,或者原子性的类这些
我心里,一万字曹尼玛,又来多线程,然后我说了几个我自己并不是很熟悉的原子类,然后聊到底层,又不会(还是太菜),然后聊线程池,然后聊线程池的创建,线程池的运行过程,然后他的优化啥的,然后聊了一下,感觉我也没啥深度,就终于不再跟我聊多线程了,(目前为止,就聊了2个东西redis和多线程,redis的东西,至少我感觉比多线程要好很多),然后面试官,又开始问了
我看你用的rabbitmq说说你是如何保证消息的可靠性的
这个其实还是很简单,从发送端就是confirm机制,接收端就是用的ack机制,然后引用到我们自己项目用的Aop把失败的消息存到redis中,并通知相关负责人去处理,这样,然后我来聊到了我用它来做分布式事务的可靠消息很终一致性,因为这些东西都是我自己引申过去说的,肯定是我比较会的,说到了如何去做它的幂等,防止重复消费,然后中间还插了一下rocketmq,可惜我不是很熟悉,它里面的事务机制,稍微说了下然后说了一下它的持久化机制啥的,很后它问了一个啥问题,说假设你什么都做到很好的情况下,怎么样才能更好的保证消息的可靠,包括你的服务器被炸了,断点,啥的。。。完成不知道再问啥,然后mq就没问了,其实看着说的简单,但是实际聊的东西还是有点的,什么死信队列啥的都是有设计到的。
我看你对JVM调优有了解,我们聊聊JVM吧,然后因为垃圾回收算法,垃圾回收器。
这个还好究竟自己有看过这方面的知识,然后就把JVM的知识说了一遍,反正就是自己知道各种扯
说说你是怎么定位线上问题的定位吧,比如说CPU或者是内存
其实我这快没怎么实战过,还是看过一些人家的解决方案,然后我就靠着记忆Cpu:通过top命令找到CPU消耗很高的进程,并记住进程ID。再次通过top-Hp[进程ID]找到CPU消耗很高的线程ID,然后找到线程ID是十进制的,把他转换成十六进制,然后用jstack找到当前线程的jstack.log的快照,然后分析他的问题。内存:其实对于内存的话无非就是2种一直是内存溢出,另外一种是内存不健康,就是内存泄露内存溢出的情况可以通过加上-XX:+HeapDumpOnOutOfMemoryError参数,该参数作用是:在程序内存溢出时输出dump文件。有了dump文件,我们找问题就很简单了,比如我们用MAT等等,找到原因假如是内存泄露的话就得具体分析了比如你的youngGC的频率,和FullGC的频率,假如是和平时完全不一样的话,我们也可以用MAT去分析一下看是否是每个对象占用的内存尤其大,并且还没有回收他,然后找到这个对象去分析他的逻辑,并且来解决这种内存泄露的问题
聊聊mysql把,平时怎么做查询,优化
反正就是那些套路什么索引啥的,说到索引了,那你对b+数熟悉吗,我。。。。又是挖坑给我,我擦。我就其实我不懂,我因为没有预备去面试题。。。。唉(还是不能注重形式)
没关系,我们来聊聊mysql的隔离级别
我又把那几个背了一下(还好这个好记得,因为真的是死背的以前)
那你给我说说可重复读的底层实现原理嘛
我擦,又掉坑里面去了。。。。唉我就只好说,还没空去了解这块
没关系我看你用的SpringCloud聊聊他的组件吧
然后我有哔哔哔啦把这些基础的平时工作的这些分布式组件给他说了
那你给我说说注册中心怎么保证自己的高可用的
其实这个还好,以前背过哈哈我就把自己对2pc的选举过程崩溃恢复,数据同步的过程扯了一遍
既然你对2pc这么熟悉。我给你个场景,你说说看这种情况怎么处理,就是因为网络原因,出现了双主问题。
我的内心的崩溃的,其实我都不知道再说啥了反正,不过有一点我是知道的,肯定是再瞎说,因为我自己也真不知道自己再说什么了,然后只能说,这个不是很清楚
好点,没事。那你说对于分布式系统来说,除了我们经常说的2pc3pc还有什么更好的方法来做数据一致性
然后我又不知道要说啥了,又只能说不知道了
然后又问了下Spring,对于Spring的一些源码的理解
我靠,终于问到一个我会的了,然后我就Spring容器的初始化过程和Spring单例bean的注入过程,和循环依靠讲了一下。这个它竟然没往死里问我了,哈哈(看来平时看点源码还是有点用的)
你现在有电脑吗,我们来做个机试吧,
然后我说我没带电脑,我想着就说算了把,谢谢您的好意,我反正也过不了,然后它就再三约我明天晚上来做,我就说没有补全我代码都写不全的,但是它还是邀请我参加,我就只能答应了,然后就挂了电话
当时我跟这个面试官约的是3月5号8点以后,看来再阿里工作也是蛮长时间的,但是人家工资高,哪里像我们做的多,工资少,不过人家水平高,这个没办法
到了8点,面试官主动给我打了个电话,然后把机试题目发到了我邮箱,然后高速我看着我写,我心理拔凉的,担心啥也写不来
然后题目其实很简单是力扣上的24题,但是我当时做的时候并不知道,我也不能百度,可惜我在那瞎写写了30来分钟,但是也是完成没有搞懂再干嘛
很后只能选择放弃
哈哈,其实还是自己太菜了,虽然说我连一面都没过(菜是原罪),但是这次面试给我的帮助还是很大,让我在没有预备的情况下知道了自己的水平,应该算是比较真实了把,还有一点就是我们工作中大都是CV大法,导致我很多的基础代码都不是很会,基础不扎实,虽然这个机试是算法,但是我很多简单代码没有补全都不会,很多简单工作的实现都是百度,导致自己的动手能力弱了很多。这点以后要改,我呢?把这次经历分享给大家,希望大家要引以为戒。好好学习,扎实基础。
文章地址:https://www.tianxianmao.com/article/online/11430.html