建议收藏!字节/腾讯/华为/美团/shopee/阿里 服务端开发面经

前言

写在最前面:目前接了字节的offer

以下面经均是以时间线排列,最好每次面试完都自我总结一下
有些问题比较少的或者没列出来的基本都是在聊项目

春招

腾讯一面(IEG)

  • 算法:删除倒数第k节点
  • tcp/udp的区别 视频/语音为什么使用udp
  • 4次挥手时的timewait
  • tcp中的流量控制和拥塞控制
  • 进程和线程
  • 进程的调度
  • 进程的通信方式
  • 大端和小端系统
  • 队列能否不使用锁进行并发
  • 队列要用多少个堆实现
  • 静态链接和动态链接
  • C++的多态(Java)
  • 僵尸进程

字节一面

  • 算法:链表反转(m到n)
  • mysql索引 最左索引
  • visitor模式
  • 进程和线程
  • 进程通信
  • 线程同步
  • java锁
  • synchronize方法和代码块
  • synchronize怎么做到可重入
  • CAS 以及哪些领域同样用到cas
  • tcp4次挥手 为什么

阿里二面(几乎都是开放性问题)

  • 进程切换

  • 进程切换分两步:

  • 切换页目录以使用新的地址空间

  • 切换内核栈和硬件上下文

  • 对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。

  • (中断/异常等触发)正向模式切换并压入PSW/PC 。 (Program Status Word 程序状态字。program counter 程序计数器。指向下一条要执行的指令)

  • 保存被中断进程的现场信息。

  • 处理具体中断、异常。

  • 把被中断进程的系统堆栈指针SP值保存到PCB。(Stack Pointer 栈指针。Process Control Block 进程控制块。)

  • 调整被中断进程的PCB信息,如进程状态)。

  • 把被中断进程的PCB加入相关队列。

  • 选择下一个占用CPU运行的进程。

  • 修改被选中进程的PCB信息,如进程状态。

  • 设置被选中进程的地址空间,恢复存储管理信息。

  • 恢复被选中进程的SP值到处理器寄存器SP。

  • 恢复被选中进程的现场信息进入处理器。

  • (中断返回指令触发)逆向模式转换并弹出PSW/PC。

  • tcp如何保证可靠

  • tcp如何保证正确性 校验和原理?

  • 把伪首部添加到UDP上;

  • 计算初始时是需要将检验和字段添零的;

  • 把所有位划分为16位(2字节)的字

  • 把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C

  • 将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。

  • 输入http之后的流程

  • java多线程(自己的看法)

  • 线程池设置多少合理

  • 如何让udp可靠

字节二面(几乎都是为什么)

  • http输入之后的过程
  • dns的解析过程
  • ip传输的过程
  • https://blog.csdn.net/thisispan/article/details/7587998
  • 整个请求传输的过程
  • 什么时候用tcp udp,什么场景下,为什么
  • html响应解析渲染的过程
  • html head里有什么元素
  • 什么时候要多线程,什么时候要多进程
  • https://blog.csdn.net/yu876876/article/details/82810178
  • https://www.cnblogs.com/yuanchenqi/articles/6755717.html
  • 如登陆,如何保证安全性
  • 后端如何保证
  • 加密算法
  • 算法:k个一组地翻转链表

美团一面

  • HashMap的实现原理,插入如果冲突,是插入头部还是尾部
  • 是否线程安全,哪些是线程安全的
  • ConcurrentHashMap如何做到线程安全
  • ConcurrentHashMap的size()如何实现
  • LinkedHashMap的区别
  • 多线程都用什么来开发
  • ThreadPoolExcutor的参数,队列使用的是哪种,是否设置初始值,无界队列是否可以
  • ThreadPoolExcutor如何操作,原理
  • Excutors.newFixed()的缺点
  • 其他的线程池方法
  • 线程如何做到交替运行
  • 多线程如何做到顺序执行
  • 线程如何做到等待其他线程完成后执行
  • synchronized和lock的区别
  • mysql的隔离级别
  • mysql的默认隔离级别
  • 幻读是什么
  • mysql的可重复读是否可以防止幻读
  • b树和b+树的区别
  • https://blog.csdn.net/z702143700/article/details/49079107
  • b+树用作索引的数据结构优势在哪
  • 平衡二叉树与红黑树的区别

美团二面

  • 网络协议有哪些

  • ThreadLocal的作用,是否线程安全

  • 进程间的通信,java进程间的通信

  • Socket 这个方式可以实现,需要在父子进程间进行socket通信

  • 队列机制 这种方式也可以实现,需要父/子进程往队列里面写数据,子/父进程进行读取。不太好的地方是需要在父子进程之间加一层队列实现,队列实现有ActiveMQ,FQueue等

  • 通过JNI方式,父/子进程通过JNI对共享进程读写

  • 基于信号方式,但该方式只能在执行kill -12或者在cmd下执行ctrl+c 才会触发信息发生。

  • TreeMap讲解,里面有什么属性,entry里有什么属性

  • java里有哪些是不需要加锁的同步方法

  • 行锁和表锁的区别、场景

  • 组合索引的使用,eg. (a, b, c)索引,where a=x; where b=x; where a=x and b=x;哪个能使用索引

  • ArrayList和linkedlist的区别

  • 有哪些集合类是线程安全的

  • blockingqueue什么场景下使用

  • java有哪些锁

  • 算法:排好序的数组,找2个数的和为M的所有组合

  • 算法:大数据下,找出出现频率topK的ip

  • 在Hadoop/Spark下如何实现

  • 看过哪些书

字节三面

  • 最近的项目(我应该说最熟悉的那个。。)
  • 写懒加载单例 为什么里外层null判断 为什么加volatile 如何做到复用(泛型)
  • 算法:(login, logout),算出在线人数峰值
  • 算法:一组边,做成树结构(左点为父,右点为子)
  • mysql:每个班级中某科目前10,如何建立索引优化
  • 阿里评估
  • 问项目,所有涉及的项目
  • mysql中索引的区别
  • springboot所带来的便利,内嵌容器与直接运行的区别
  • 对Collection的了解
  • 接口和抽象的区别

腾讯一面()

  • 线程池原理,threadlocal
  • tcp udp区别,tcp的4次挥手
  • 吃鸡用tcp还是udp?
  • 客户端发起10次服务调用,udp和tcp场景下,服务端调用的次数?
  • 多态的描述
  • 抽象和接口
  • 浅克隆和深克隆
  • 线程和进程的区别
  • 进程的同步
  • 死锁的条件,如何解决死锁
  • 进程句柄在内存中的结构
  • http中keep-alive的作用
  • 301 302 404 502的意义
  • CAS的原理,缺点,如何解决ABA问题
  • 静态内部类和非静态内部类

华为一面()

  • 算法题:全排列 + 字典序

秋招

  • 腾讯一面(音乐源)
  • jvm内存 java堆与元空间的区别
  • springboot的优点
  • springboot的类加载
  • jvm的类加载
  • jvm的启动过程
  • 内存溢出和内存泄漏
  • 如何解决内存溢出/泄漏问题
  • 最熟悉的数据库
  • 悲观锁和乐观锁,分别使用的场景
  • 你的优势or你做的最满意的
  • rpc调用机制
  • 如何实现方法调用
  • 服务发现、服务注册
  • consul如何做到
  • 服务熔断
  • hive、hbase的存储
  • 列式存储和行式存储,列式存储的实现
  • mysql acid
  • mysql如何做到事务回滚
  • mysql什么时候行级锁、什么时候表级锁
  • arraylist和hashmap的底层实现 扩容机制
  • 数据库主从同步 如何做 基于redolog/undolog
  • mysql 使用for update什么时候行级锁什么时候表级锁

shopee一面

  • 算法:数组和target,找出每对乘积为target的数
  • 虚拟内存 32位的大小
  • tcp和udp 什么场景 流量控制
  • mysql 什么是事物 acid 隔离级别
  • innodb的默认隔离级别 能阻止什么情况
  • acid每个机制分别通过什么来实现(redolog undolog mvcc)
  • 索引是什么,优缺点,为什么用b+树,不用hash表、b树、平衡搜索树、红黑树
  • hash表是什么,怎么解决冲突,查询和插入的复杂度
  • tcp 3次握手
  • tcp timewait 大量timewait会如何
  • 进程 线程 协程
  • 协程的实现机制

网易一面(互娱)

  • 算法:已排序数组a,b, a大小为a+b, 将a,b合并到a,仍为排序
  • 算法:链表、链表排序(可以二分)
  • cache页的调度算法
  • java多继承问题,如何实现多继承效果
  • java interface是否可以有属性
  • gc机制
  • java里final的用法(包括类、属性、方法参数、方法内变量
  • 进程间通信 有名管道和匿名管道的解释
  • linux中的’|‘
  • 编译原理(可以回忆回忆,方便讲
  • 对Python的了解
  • sychronize 死锁的条件
  • thread和runnable的区别
  • 异常是什么,解释名词。。(是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。* RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别* 引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
    vc++的函数参数与java的有什么不同

网易二面(互娱)

  • 算法:圆内随机点
  • 算法:矩阵中最大正方形(LeetCode原题)
  • 算法:爬楼
  • 腾讯一面(业务运维)
  • 算法: 先序遍历、链表有环
  • 结构体: 限流器
  • linux的指令(重点看看!)
  • 服务熔断、限流

字节转正(一面)

  • 算法: 爬楼(递归与非递归,递归如何减少复杂度)
  • 业务设计: 文件系统,设计数据库表,如何建索引
  • oauth
  • 服务端如何设置cookies(Nginx)(header里Set-cookie, 参数name,expire…)
  • 运营后台请求的全过程(http dns ip …)
  • 如何存储登录信息
  • b+树的复杂度(logMlogmN = logN)
  • b+树的优势
  • https的加密方式
  • treemap的查询复杂度

字节转正(二面)

  • 算法: 堆排序
  • 算法: 先序和中序,构造后序
  • 算法: 连通图,最小生成树
  • https://blog.csdn.net/a2392008643/article/details/81781766
  • go channel buffer的作用
  • go多态的实现
  • 微服务的概念 优劣势(与单体应用比)
  • 熔断和降级的原理(熔断的原理和作用要好好看)
  • 熔断 - 服务雪崩
  • innodb的默认隔离级别
  • innodb不串行怎么防止幻读
  • innodb的存储结构
  • b+树与b树的区别、优势
  • b+树非叶子节点不存储数据,可以一次性从磁盘读出更多的索引数据
  • b+树在范围搜索中占有很大的优势(b+树链表搜索、b树需要根据中序遍历查找)
  • redis分布式锁
  • redis zset 读写的复杂度
  • 底层skiplist跳表(key:score, value: member), hashmap(key:member, value: score)
  • go slice什么时候会扩容,是否会导致与原数组不同
  • innodb联合索引的存储结构
  • mysql如何查看是否使用了索引(explain)
  • mysql explain extra里的using where/using filesort等
  • https://segmentfault.com/a/1190000021458117?utm_source=tag-newest

字节转正(三面)

  • 算法: 中文字转int
  • 算法: 随机数函数f3(0,1,2), 转化成f5(0,1,2,3,4)
  • java类加载
  • java equals与==的区别,为什么重载equals同时重载hash
    vjava string为什么是final

华为一面

  • 算法: 乘积为正数的最长子数组
  • go与java的区别 感受
  • springmvc 请求过来如何识别到哪个方法 最先到达哪个类(具体的调用过程)
  • vjava gc
  • gc root的选择
  • 并发的问题(没太听懂问题。。)

华为二面

  • 算法: 探索地图 固定步长 起点走到终点(dfs)
  • 其余都是项目问题

总结

最后我为大家准备了一些Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等,点击这里免费获取。

猜你喜欢

转载自blog.csdn.net/weixin_53170315/article/details/113087305