字节腾讯三轮社招面经(附个人回答)

JAVA烂猪皮

共 6830字,需浏览 14分钟

 ·

2021-06-10 03:19

走过路过不要错过

点击蓝字关注我们




背景

本人2本毕业,目前工作四年,一直是Java。做的都是些二线公司,没做过一线。四年跳了三家公司。在家休息了几个月,五月中旬开始面试。


字节跳动

由于跳槽过多而且已经是淡季的原因。内推的我的字节哥们儿,推了不知道多少个部门,从字节海外电商推到教育线简历都由于频繁跳槽都挂了。最后才被广告营销捞了起来(而且居然是个Java部门)。这里还是奉劝大家跳槽不要像我这么频繁,唉。另外大厂,建议找人内推。这是我第一次面字节,也是今年第一场面试,各种意义都算是初体验了233。


字节跳动1面:


一面是个小哥,估计比较腼腆,骗我说显示坏了他没发开摄像。我笑着说没事。技术面试20分钟,算法我做了10分多种orz。总计半个多小时。


1.简单说下项目

我项目比较挫,就介绍了下,然后项目就跳过了

2.redis的zset是如何实现的?为什么使用跳表不使用别的数据结构?

redis的zset基于ziplist和dict以及skiplist实现。这里我简单说了下这三个有什么字段,以及优化的细节。至于为什么使用跳表,我直接回答了官方原文。话说回来感觉zset每个大厂都会考啊。

3.redis的持久化方式

rdb和aof,这里本来我想扩展说一下。面试官直接说时间有限,不用了,希望能在短时间多问点东西。这场面试整体节奏很快,很多都是简单说下就问下一个问题了。

4.redis的集群方式,各有什么特点

哨兵配主从,可以保证可靠。redis cluster可以增加可扩展性。

5.redis cluster的通信机制,说一下蜂巢

基于goosip,具体的不了解,这一段就跳过了。

6.mysql innodb 以及mongodb的索引结构

b+树,简单讲了下。这一题就结束了。

7.rr级别如何防止幻读

这一题我听错了,听成了rr级别为什么要防止幻读。所以回答偏了。就说因为rc级别不会有  LostUpdate问题,但是rr级别由于mvcc版本会出现,rr作为更高等级级别必须要处理该问题,所以使用锁来处理,但是快照本身不能解决write skew,所以并没有解决幻写,某种角度来说也没有完全解决幻读。后面发现好像回答方向错了,所以还是简单提了下快照读,当前读,间隙锁,行锁之类的东西。这一题讲的有点久了,失误失误。

8.synchronized原理,讲一下底层实现

一开始我也就标准的说了下锁升级的过程,也说了mutex lock。最后面试官问到比较深,问我moniter里面啥内容,我就记得waitsets,entrylist,owner,count这几个,然后说了下,Java基础就这么结束了。

9.除了zk你还用过其他注册中心吗?之间有什么区别

nacos,eureka,consol。有的是cp,有的是ap。注册中心一般走ap就够了。简单说了下原因

10.算法

开始出的是,最小编辑代价。一看是较难,我担心做不出,要求换了一题。换成了二叉树之字形遍历,由于紧张,结果写了10分钟。尴尬的一笔。

整体而言就是节奏很快,是今年节奏最快的一场面试,建议大家准备面经到时候也琢磨下怎么用最少的字回答最多的内容。最后出算法的时候,出了一道较难把我心态整崩了,因为据我了解字节一般前面回答的不错的话,算法不太会刁难你。当时做题的时候我满脑子都想着为啥出这么难,我前面回答的还行啊。其实面试官可能也不懂这个规矩,就随便出了一道,不要太敏感2333。


字节跳动2面:


今年最难的一面来了。面完我整个人都裂开了。面试官我感觉应该也是今年所有面试官中技术最强的,没有之一。另外面试官那边噪音很大,有时候听不清他说什么。不过这回面试官终于露脸了。技术25分钟,算法25分钟。


1.说下项目

这回面试官比较关注服务器的数量,qps之类的东西。这些我都记得,不过项目整体比较挫。面试官也就不深问了,直接进入八股文环节。

2.会什么语言?说下jvm吧。

我只会java,哈哈哈。所以面试官就问java了。jvm问的还挺深,什么tlb,逃逸分析,栈帧里面有什么,还好去年看过全都防出去了。

3.说下metaspace和permGen。

本来信号就不好,还说英文,我听了几遍才知道问的是元空间和永久代。简单说了下。然后

4.元空间中创建对象会不会开辟物理地址内存

这tm问的是什么?我题目都不太懂orz

5.system.gc()一定会触发gc吗?和full gc有什么关系?

不一定。该题回答的比较朴素。哈哈。java就这么结束了

6.redis的aof文件过大怎么处理,怎么解决,开启aof的方式有几种?了解rewrite命令吗?

由于不了解这一块儿,几乎团灭了。redis还算是我的强项,结果居然败的这么惨

7.kafka。。。

回答没用过(其实用过,但是好多年前的事情了,所以就直接说没用过,简历上只写了rocketmq。)

8.用过什么mq,说一下rocketmq的消费方式,什么是死信队列

只用过rocketmq。集群和广播,面试官问只有这两种吗,我说是啊。然后大家一阵尴尬。  死信队列简单讲下就结束了。

9.说一下exchange。。

回答说我没用rabbitmq(其实我用过)。面试官原来前面听错了,以为我用过的是rabbitmq,吐槽说难怪消费方式回答只有两种。

10.ack机制,offset何时位移,broker复制原理

作为mq白痴,基本回答的都是浅尝即止。其实我activemq,rabbitmq,rocket,kafka都用过(毕竟跳槽多)。但是mq确实是我的弱项,唉,这一块儿面的我直接心态崩了,当时心想要挂要挂。

11.mysql索引优化没有走对是什么原因

终于又问我擅长的了。说了下优化器的策略,面试官说不是想问这个,就问我explain,然后我就把explain的字段都说了一遍,面试官说还是理解错了。然后说算了这题跳过,有点小尴尬

12.explain语句会执行sql吗

不会,优化器就结束了。所以rows会有误差。

13.mysql两段提交

说了下binlog和redolg以及分组。说实话,直接就说两段提交,不熟悉的人可能都不知道问的是啥啊

14.说下undolog,是不是只有rollback才会触发undolog

基于回滚保证原子性。由于innodb的锁是锁住索引,所以更新主键之类的的时候,原数据也会保留,所以更新后微commit前一条数据会变两条。 在commit的时候会回滚掉原数据,这个场景有点绕,但是我觉得我应该没回答错。

15算法

字符串数组中的字符能否拼接成为某个字符。由于不是牛客原题,当时心态又比较崩。所以这题算然不难但是最后没写出来没走通用例orz。

面完心态崩了,除了mysql,其他回答的都一般,算法也没做出来。面试官看我脸色不好,还挥手让我后面加油。当时是真的以为自己挂了。没想到最后有三面,这里感谢下2面面试官,哈哈哈。


字节跳动3面:


三面面试官是个大佬,头秃的严重,全程都挺忙的样子,有点心不在焉,大多都是聊天,问了下三分工作公司都是干啥的,自己做了什么项目。聊天10分钟,技术10分钟,算法5分钟。


1.java创建一个网络io流。会有什么操作,基于java底层或者网络或者操作系统说一下。

这块我java就简单了下(因为据说字节哪怕面的是java,也很可能做go,所以感觉多少点语言之外的可能好一点)。主要还是说了操作系统和网络。比如ringbuffer,dma,软中断硬中断之类的。

2.零拷贝说一下

就简单说了下sendfile和mmap。此外提了句senfile比较类似于网络中的对等概念,然后转到了网络

3.说一下ftp和http的区别

不了解ftp,跳过

4.文件下载一般用什么协议,udp还是tcp

udp用的多一点,两个都可以。udp主要nat穿透的话打洞容易,这一题过。

5.close wait和time wait有什么区别

这两个我回答的时候刚好说反了,哈哈哈

6.怎么保持长链接,为什么需要长链接

keep-alive。不然每次链接都要创建fd,浪费资源开销。

7.日志海量收集

开始的时候没听懂问什么就说日志用kafka啊。最后他提示多台机器,我就说mapreduce,简单说了下mapreduce,就结束了。

8.你说的主要是离线处理,如何实现实时的呢

流处理的话,flink,spark都没用过,所以不抢答了(我简历也没写我会大数据啊。怎么问这个orz)

9.算法

给出一串字符串,写出选取三个字符组合出来的所有可能。这一题是唯一一题白板,不需要运行。(这题看到我就想用dfs加回朔,但是问了下面试官说固定只选三个,我就傻傻的决定写了三层for循环,写完后面试官看了一下说你就写了三层循环啊,我说嗯)

这一面问的感觉都有点莫名其妙,很多人看了我的面经都吐槽问的都是些啥。最后就挂在这个算法上了。感觉自己傻了。内推我的老哥说我面评就一句话,说我算法表达弱,我想想就明白了,大家写算法的时候一定要想清楚,宁可写出来是错的,思路也要往最优解走啊。唉,字节也是我第一次当场写算法,以为只要结果对就行了,结果吃了不了解套路的亏。


字节总结


最后知道挂了还是很可惜,不仅已经到第三面了,最重要的是明明是能做出来的,结果自己傻x了。唉,看来是和字节无缘(感觉对不起2面面试官)。不过字节的效率还是很高的(腾讯这点就太逊啦)。可惜了我刷了这么多算法,字节面完后我就再也没有刷过一题算法了。要说最大的问题,就是之前没写过算法,所以一旦不是牛客的原题,我就会很慌。其实当时我的算法水平已经够应付社招了。至少之后没再刷过一题算法以及其他公司算法难度和字节差不多的情况下,我都是基本快速撸完,还没有哪个五分钟不能过的。也算是字节让我在算法上成了老油条吧233。


腾讯


在字节挂了之后的第二天就开始腾讯一面啦。字节和腾讯的面试经历感觉互为镜像。字节是我面的第一家,而腾讯则是我面试的最后一家。也是找腾讯的小伙伴内推。开始投的csig(去年12月面过然后挂了)一周后得知简历挂了,然后转投ieg,几天后简历也挂了。最后内推了pcg(居然也是个java部门),终于能面了。虽然我还是想面csig啦。


腾讯1面:


一面应该是组长,人很好。也是腾讯唯一一个和我全程视频露脸的面试官orz。是我今年所有面试经历中最好的,没有之一(另外提一下第2的话应该是微盟的2面,上海的小伙伴也可以试试微盟啊)。这一面只面技术不问项目(正好我项目不行,美得很)。技术一个小时10分钟(天呐是今年最长的一场了),算法五分钟不到结束。


1.说一下mysql的悲观锁乐观锁实现

乐观锁版本号加自旋。悲观锁就是slect for update或者  share mode

2.java里面是怎么实现的呢

悲观所主要是synchronized,走的操作系统mutex,又讲了一遍锁省级。乐观锁就是cas,底层是cpu指令。又说了下unsafe相关的内容。

3.如何取舍乐观锁悲观锁场景

当时面试心情好,就说了大实话。场景取舍类似于上厕所。小号就是乐观锁,毕竟排队一会儿就能等到,配合自旋等待就行了,如果使用悲观锁上下文切换(从厕所走到工位)花费的时间不划算。大号就是悲观锁了,毕竟等待的时间一般会很长。二者取舍就预测是否发生竞争,或者竞争的时间长不长。

4.说一下concurrenthashmap怎么实现。1.8比起1.7有什么优化

cas+synchronized,1.7则为分段锁。另外优化了寻址算法和hash算法(具体说了下两个公式)。(ps,最重要的红黑树没说,不过感觉不要紧啦)然后说了下怎么计算总数。扩容的步骤。

5. concurrenthashmap和hashtable的区别

一个最终一致,一个强一致。前者读的时候不加锁。

6.问一下网络吧。三次握手过程,能不能改为两次

经典八股文。ack,syn,半链接这些说一下就可以了。不能改为两次,如果没有中间消息丢失在没有超时机制的情况下就会产生网络的死锁。(不过终于到了我最擅长的网络啦,之前除了字节三面就没人问我网络,不愧是腾讯,嘻嘻)

7.四次挥手说一下,能不能改为三次。为什么要等待2msl

挥手过程又是八股文。可以改为三次,只要服务端开启延迟发送,第二第三步就可能变成一步。2msl是为了保证序列号不紊乱,不产生脏数据。顺便说了下序列号怎么产生的。

8.tcp的一些八股文,校验和,滑动窗口,拥塞控制,流控,nagle算法

又是基础八股文,tcp最大的缺点也就在流控了。流控还要维护整体网络,正常人一旦页面读取失败肯定会疯狂刷新页面啊。怎么可能等待一段时间再刷页面呢。

9.https加密过程

这一题我说太多了,从seesionid,sessionticket到加密套件的四个字断含义,加密套件只有两个算法需要填写,而只有一个算法需要填具体值。还有服务端是否需要发送证书,客户端是否需要发送证书。不同加密算法  ECDSA和RSA中间的过程有什么不同,讲到一半就感觉很累,不想讲了。越讲越快。

10.ca证书如何验证

标准八股文,就一般证书sha1加sha256验证证书完整性。还有就是最重要的密码套件中的算法怎么用(一般就是aes和sha256)。又讲了下证书链,多级证书。还有openssl的pem转crt等等。什么是自签证书(diss了一下12306,哈哈)。到这里网络就结束了

11.说一下redis的数据结构,zset怎么实现的

基础的5个加布隆过滤器,hyperloglog,geohash之类的。zest和字节一面说的一样。

12.zset怎么实现排名

span字段

13. 布隆过滤器怎么实现的,能否有删除功能

bitmap多个hash,增加计数器功能就能一定量实现删除功能(删除这块儿面试官不知道,所以听完有点懵逼,说自己之后在想一下我说的话)redis在这里就结束了

14.数据库的事物隔离级别,各基于什么方式实现

我三家公司一➕用的orcale一家用的pgsql,一家用的mysql,所以我就老老实实三个数据库全都说了一遍。面试官估计对pgsql的ssi很感兴趣,我赶紧说那个太学术了,我解释起来有点难就糊弄过去了233

15.常见的索引结构

lsm树——rocksdb,leveldb  ; b树——mysql的innnodb,mongodb ; hash索引 —— mysql的menory,innodb。 倒排索引 —— es,sloar。还有全文索引,r树。

16.mysql的锁,锁的具体使用

主要就是行锁,表锁,页锁。然后问其他分类呢,我就说x锁,s锁,ix,is。然后又问我别的分类,我就说行锁,间隙锁,邻间锁。在具体的就是innodb我记得有四个锁,名字记不住哈哈。至于sql具体的使用,有个锁升级降级策略,那个太绕了,简单说了下面试官就放过我了。

17.mysql的组件

八股文,就强调了一句新版本已经没有缓存了。面试官投来赞许的目光,嘻嘻

18.聚集索引说一下

就索引会存全部数据,按顺序存储之类的。另外聚集一定有唯一性约束。所以不能走出change buffer

19.mvcc

纯八股文

20.说一下b+树吧,为什么innodb不像redis那样使用跳表。

因为redis几乎是纯内存,不像mysql要刷磁盘,所以要保证层级尽可能的低,不然影响性能。

21.说一下redis的主从复制过程

八股文,不过怎么又绕回redis了,汗。

22.一致性哈希算法说一下,具体扩容过程。

主要解释了下slot就结束了,具体扩容过程不了解。redis到此问完了。

23.说一下java的垃圾回收器吧,有什么优缺点

说了zgc,香浓多,g1,cms。面试官主要问了g1和cms,然后问了优缺点又问了使用场景,由于很久不java刷面经了,场景这块儿差点没说上来。java到此也就结束了

24。cglib和jdk代理的原理

前者操作asm字节码,后者是继承proxy类。说了点具体源码,面试官就跳过了。





获取往期以上更多最新面试题资料,直接转发一下这篇文章+关注公众号【Java烂猪皮】关注后回复【666】即可获取哦~




往期精彩推荐



腾讯、阿里、滴滴后台面试题汇总总结 — (含答案)

面试:史上最全多线程面试题 !

最新阿里内推Java后端面试题

JVM难学?那是因为你没认真看完这篇文章


END


关注作者微信公众号 —《JAVA烂猪皮》


了解更多java后端架构知识以及最新面试宝典


你点的每个好看,我都认真当成了


看完本文记得给作者点赞+在看哦~~~大家的支持,是作者源源不断出文的动力

浏览 35
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报