字节二面凉经

社招广告数据平台——后端开发Java岗

Posted by GrayWind on May 12, 2020

不知不觉一年没更新了,简直懒得飞起,更一次面试凉经。

一面

先自我介绍,简单讲下经历和项目,我严重怀疑是HR完成KPI,我都一年多没更新简历了,面试官听完自我介绍表示这简历上的内容严重过时了。

算法题:

第一个是手写,1-n的数字字典排序,第k大。先描述下思路给面试官,然后开始写,做法是字典树前序的递归遍历。后面两个题是描述思路,两个栈实现队列,运用另一个栈翻转顺序简单。第三题是两个交叉链表找交点,遍历长度,长的先走n步,然后两个指针一起前进,直到指向同一个节点。

问:讲下java锁升级,字节码锁的标志位怎么保证是自己修改的

答:是JVM保证的原子操作用了CPU的原子操作指令码。

问:CAS什么意思,偏向锁的自旋是什么。

答:验证然后更改值,基于CPU指令的原子操作。自旋是不断循环检查标志位,不再被占用就获得锁。

问:对象从创建到回收的过程

答:先加载类然后分配空间再设初始值。

问:空间分配在哪

答:一般是java堆,static final的字符串常量在元空间的常量池,如果强制用unsafe操作也能搞到堆外空间(现在考虑下好像跟初始化没关系)。

问:垃圾回收

答:标记-清理和标记-复制

问:复制是怎么做的

答:把新生代分成两块,标记存活对象从A复制到B

问:两块可能同时有存活对象吗

答:没有,所以会浪费一半的空间。问这两块和新生代的关系,答两块一样大,是新生代一部分(这块内容忘了)。

问:老年代升级

答:多次复制依然存活,或者对象过大直接升级到老年代。

问:MySQL索引是什么

答:B+树

问:对A建了索引之后查询过程是怎么样

答:搜索树左小右大找到叶节点,叶节点可能存了主键值或者完整数据,前者需要再查一次主键的索引。非叶节点存了什么,叶节点值的范围。

问:联合索引的结构是什么

答:不知道(概念不清楚,是针对单列索引的,一样的树结构,但是每个节点里包含多个索引值)

问:CPU高怎么排查

答:先看下业务打点。面试官说假设不知道业务。我说arthas之类的工具打印多次最忙的n个线程,看下是不是有几个线程始终繁忙,可能有死循环。

问:redis用过吗

答:生产中用的不多,做RPC相关多些,zk比较了解,跳过。

讲下XX项目

有什么要问的,问了下技术栈,这个广告数据平台后端岗是少数用java的,需要懂点大数据估计是flink、tenseflow相关的。瞬间觉得不香了,我以为是做分布式存储的感情是个BI后端处理数据的,真不应该听信HR还是应该自己找人投啊(摔

二面

先讲下做过最有挑战的项目,现在上线和流量、资源使用情况怎么样。

问:zk作为注册中心发现服务过程

答:查询某个路径下的节点,注册监听器,有变更通知时更新本地数据

问:还有什么注册中心,跟zk区别

答:etcd,读写效率更高,强一致性在注册中心场景下不是特别必要

问:怎么处理client心跳假死或者假活的问题

答:client把对其他client之间的请求错误上报到注册中心,注册中心发现一定的错误率就切掉节点

算法题:

  1. 从左到右递增,从上到下递增的二维数组,查k是否存在其中

LeetCode240,做过但当时没看最优解,只能说出是路径查找,应该是先寻找第一列中小于k的最大值,然后在该行中寻找小于k的最大值,该点为起始点,逐渐向右上角路径查找

  1. 2*1的矩形横或竖放置,不重合完全覆盖2*n的矩形,一共有多少种摆法

典型dp,f(n)=f(n-1)+f(n-2)*2

  1. 100亿数据最大k

优先队列,然而面试的时候卡壳了没想起来

问:数据库索引为什么是b+树

答:范围查找叶子节点之间链表有优势。高度矮,分块大小有利于磁盘IO读取

问:操作系统Pagefault是什么

答:页表中缺页,通知CPU从硬盘中读取指定页到内存中

问:hashmap怎么实现

答:数组,链表,红黑树略

问:hashmap要线程安全怎么办

答:concurrenthashmap的cas和分段锁

问:乐观锁是什么

答:比如CAS,认为没有冲突不加锁去处理

问:ABA问题是什么,如何避免

答:表面上我1->5的操作成功了,但实际上经历了1->2->1->5的过程。可以用modCount检查修改次数。

总结

项目经历和岗位差距较大,二面面试官直接提了,我也欣然接受然后挂了。提醒大家,想认真找不要听信hr推的面试,千万要自己投递。面试找感觉的话无所谓。