字节跳动 Java 二面面经

  1. synchronized 和 ReentrantLock 的区别?底层实现机制分别是什么?
  2. volatile 的作用是什么?能保证原子性吗?
  3. ThreadLocal 的原理,为什么会发生内存泄露?
  4. 线程池的参数配置,拒绝策略有哪些?在高并发场景怎么设计?
  5. JVM 内存结构,GC Roots 有哪些?
  6. CMS 和 G1 垃圾回收器的区别与使用场景。
  7. 遇到线上 Full GC 频繁,你会怎么排查?
  8. 说一下 MySQL 的事务隔离级别,每一级别可能出现的问题。
  9. MySQL 中的索引类型有哪些?为什么用 B+ 树而不是 B 树?
  10. Redis 的缓存穿透、击穿、雪崩问题是怎么解决的?
  11. 手写 LRU 缓存(要求 O(1) 时间复杂度的 get 和 put)。
  12. 判断链表是否有环,如果有,返回环的入口节点。
  13. 滑动窗口最大值问题,要求给出时间复杂度尽量低的解法。
  14. 设计一个评论系统,要支持高并发写入、分页查询、热评展示,还要考虑防刷。
  15. 你在项目中遇到的性能瓶颈是什么?当时是如何定位并解决的?
  16. 你做过的项目里,最有挑战的一次优化或故障排查经历是什么?

面经总结

字节的二面往往比一面更深入,重点放在 并发、JVM、算法、数据库与缓存、系统设计 五个方面。

  • 并发 & JVM:一定会被追问底层原理,光会用不够,要能解释「为什么」。
  • 算法:一般 1–2 道,要求写出代码,复杂度要说清楚。
  • 数据库 & 缓存:围绕 MySQL 和 Redis 的高频问题,缓存一致性、事务隔离、索引原理几乎必考。
  • 系统设计 & 项目:会结合你简历里的项目,让你说出架构设计、优化措施以及背后的权衡。
  • 提问环节:最后通常会问「你有什么问题要问我」,不要空着,可以问团队技术栈、业务场景、挑战点。

全网最全面的java面试八股文专栏:https://www.nowcoder.com/creation/manager/columnDetail/0n9XOd

全部评论
同学,瞅瞅我司,医疗独角兽,名额有限,先到先得,我的主页最新动态,绿灯直达,免笔试~
2 回复 分享
发布于 10-09 13:19 广东
清华爷也学java
点赞 回复 分享
发布于 10-11 13:39 江苏
求大佬,写一篇帖子讲解评论系统设计
点赞 回复 分享
发布于 09-25 16:37 北京

相关推荐

12-08 12:43
已编辑
门头沟学院 Java
那些杀不死我的 反复追着我杀!!1.jvm包含哪几部分classloader:将编译(.java->.class)好的java字节码文件(.class文件) 加载到内存中(也就是运行时数据区Runtime data area 存放运行时数据(线程私有:栈 本地方法栈 pc ,进程级(也就是所有线程共享):堆 本地方法区)Execution engine 执行引擎,class文件被加载后 将指令和数据放在内存中 执行引擎负责将命令解释给os 也就是将JVM指令翻译为os指令集Native interface:本地库接口2.jvm内存结构/运行时数据区线程私有的:栈(每个方法执行时创建栈帧 存局部变量表等) 本地方法栈(为Native方法提供服务) 程序计数器(存当前线程执行的字节码指令地址)线程共享:堆(最大的内存区 存对象实例、类对象) 方法区 (存类有关的信息 静态变量等)3.说一下永久代和元空间都是对 方法区 的实现永久代:JDK7 及之前的实现,属于堆内存的一部分,有固定大小限制(通过-XX:PermSize/-XX:MaxPermSize设置),存储类元信息、常量池等,易触发永久代 OOM元空间:JDK8 及之后的实现,使用本地内存(不在堆中),大小受物理内存限制(默认无上限),仅需通过-XX:MetaspaceSize设置初始触发 GC 的阈值4.为什么jdk8要将永久代替换为元空间解决永久代OOM问题 简化类元数据管理 兼容JVM规范5.类加载过程加载:通过类全限定名获取字节码流,将字节码转化为方法区的类元数据,同时在堆中生成Class对象验证:确保字节码符合 JVM 规范(如文件格式验证、语义验证),防止恶意字节码破坏 JVM 安全准备:为类的静态变量分配内存并赋默认值(如 int 赋 0、对象赋 null),不执行赋值语句(赋值在初始化阶段)解析:将常量池中的符号引用替换为直接引用(如类、方法的内存地址),该阶段可延迟到初始化后执行。初始化:执行<clinit>方法(静态变量赋值 + 静态代码块),触发时机是 “主动使用”(new 对象、访问静态成员、反射、初始化子类、主类),且每个类仅初始化一次6.类加载机制(双亲委派制)1类加载器收到加载请求  -> 2将请求委托给父加载器,一直向上委托,直到启动类加载器 -> 3启动加载器检查是否能加载这个类,能则使用当前加载器,否则向下传递 ->4重复步骤3 如果找不到 class not foundJVM 默认类加载器层级:启动类加载器(Bootstrap)→扩展类加载器(Ext)→应用程序类加载器(App)→自定义类加载器7.why双亲委派保护核心类库(如String由启动类加载器加载,避免自定义类篡改替换)防止类重复加载8.自定义类加载器需要注意什么重写findClass方法(not loadClass,避免破坏双亲委派)9.双亲委派模型有哪些破坏场景 为什么要破坏Tomcat的WebAppClassLoader:Tomcat 为每个 Web 应用创建独立类加载器,优先加载应用内的类(而非委托父类),目的是隔离不同 Web 应用的类(防止不同应用的同包同类冲突)JDBC 的 SPI 加载:JDBC 的核心接口java.sql.Driver由启动类加载器加载,但具体实现(如 MySQL 驱动)在第三方包,启动类加载器无法加载,因此 DriverManager 通过线程上下文类加载器(破坏双亲委派)加载实现类(可能会让详细说一下SPI机制一些热部署实现:自定义类加载器加载更新后的类10.类卸载条件类所有实例被完全回收 类加载器被完全回收 Class对象无任何引用(FullGC时发生11.介绍一下gc机制涉及对象可回收判定、垃圾收集算法、分代收集模型、垃圾收集器、GC 触发时机等维度(问这么大 吟唱启动12.常见gc算法标记-清除,标记-复制,标记-整理,分代收集13.介绍一下CMS和G1(1)CMS 收集器(老年代专用)核心流程:初始标记(STW,标记 GC Roots 直接关联对象)→并发标记(无 STW,遍历引用链)→重新标记(STW,修正并发标记的遗漏)→并发清除(无 STW,清理可回收对象)优点:并发收集,STW 时间短,适合低延迟场景缺点:产生内存碎片、CPU 消耗高(并发阶段占用 CPU)、依赖老年代空间预留(易触发 Full GC)(2)G1 收集器(全堆收集)核心流程:将堆划分为多个大小相等的 Region,包含新生代 Region 和老年代 Region;流程为初始标记→并发标记→最终标记→筛选回收(STW,优先回收垃圾多的 Region)优点:兼顾吞吐量和延迟、可预测 STW 时间(通过-XX:MaxGCPauseMillis设置)、无内存碎片(回收时整理 Region)缺点:内存占用高(维护 Remembered Set)、小内存场景下性能不如 CMS14.jvm如何判断对象是可回收的早期方案引用计数法(无法解决循环引用问题)可达性分析算法判定对象是否不可达,结合引用类型细分可回收时机,finalize 机制完成最终判定15.能否将对象分配在栈上jvm针对“逃逸”做了优化分析对象的作用域是否逃出方法 / 线程,若逃逸则可直接分配在栈上 无需gc16.jvm调优核心思路是什么监控 分析 参数调整 验证17.一般会调整哪些jvm参数堆大小:-Xms2g -Xmx2g(初始堆 = 最大堆,避免堆动态扩展的开销)新生代大小:-Xmn512m(新生代占堆的 1/4~1/3,过小会导致对象提前进入老年代)Survivor 比例:-XX:SurvivorRatio=8(Eden:S0:S1=8:1:1,保证新生代对象有足够空间存活)晋升老年代年龄:-XX:MaxTenuringThreshold -XX:InitialTenuringThresholdGC 收集器:-XX:+UseG1GC(默认推荐,兼顾吞吐量和延迟)、-XX:+UseZGC(低延迟场景)GC 日志:-XX:+PrintGCDetails -Xloggc:gc.log(输出 GC 日志用于分析)元空间:-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m(限制元空间大小,避免元空间 OOM)18.Jvm调优经验《没有经验!!》(回去等通知吧19.内存泄漏和OOM的区别?如何排查(1)内存泄漏:对象已无业务意义,但仍被引用(如ThreadLocal......),导致无法被 GC 回收,长期积累会引发 OOM① jmap -dump:format=b,file=heap.hprof导出堆快照;② MAT分析快照,定位 “无法回收的大对象” 和 “持有其引用的 GC Roots ③结合 Arthas 的jvm/heapdump命令定位泄漏代码(如静态 Map 未清理)(2)OOM:JVM 内存不足(如堆 / 元空间 / 栈超出上限),无法为新对象分配内存,直接抛出 OOM 异常① 看 OOM 类型(堆 OOM / 元空间 OOM / 栈 OOM)② 堆 OOM 分析对象分布(是否大对象过多) 元空间 OOM 检查类加载数量(是否频繁动态生成类) 栈 OOM 检查递归深度或线程数20.线上OOM问题如何排查21.如何分析gc日志22.线上频繁FullGC如何排查23.讲一下对jvm的理解(太大了 上文内容挑一些吟唱24.jmmJava Memory Model Java 内存模型,Java 虚拟机规范中定义的一种抽象内存模型,并非物理内存的实际布局,其核心目标是解决多线程环境下的原子性、可见性、有序性问题,为多线程编程提供内存访问的一致性规则欢迎佬赐教上辈子🔪👨放🔥 这辈子十月(底)秋招!!
查看23道真题和解析
点赞 评论 收藏
分享
TimeLine:11.28 一面12.3 二面12.5 HR面,下午直接发offer项目:知光平台 + 点评一面1. 自我介绍(介绍学历+项目)2. 介绍一下知光中 Feed 流中用到的三级缓存?(本地缓存+Redis 页面缓存+Redis 片段缓存)3. 你知光的项目中怎么保证的 Caffeine, Redis 和 MySQL 的一致性4. 某一个用户发帖,他的粉丝是怎么收到的?(项目中还没做,简单说了下思想)5. 推流模式对于大V是不是有问题?6. Redis 数据结构,重点讲一下 ZSet7. 设计一个 key 去重,value 排序的数据结构(其实就是 ZSet)8. 秒杀怎么设计的,lua 脚本怎么实现的9. 分布式缓存是怎么选择节点的?10. 一致性 hash 怎么做的?11. B+ 树底层原理,延伸到索引12. 讲一下 go 的 channel 和协程的用法和你的理解13. 算法:力扣 1838 最高频元素的频数(冷门,字节喜欢出这种)14. 反问二面整个二面大部分都在围绕操作系统底层拷打,算法题也不常规1. 自我介绍(学历+项目)2. 什么情况会出现缓存穿透,你项目中有处理过这个吗?3. 除了缓存空值还能怎么解决,如何在查询之前判断数据库里是否有某个值4. 讲讲你项目中的 hotkey 怎么设计的?5. 什么是 Outbox 模式?为什么用 Canal?具体讲讲6. 问 ProtoBuf 协议了解的多不多(就 RPC 的那个二进制传输协议)7. 如何优化读取一个大文件(没答出来)类似于 10亿个QQ号,如何快速查找。8. 协程和线程的区别,为什么协程切换更快9. 内核态切换10. 操作系统内存映射 mmap11. Go 语言,GMP 模型12. 算法题(面试官直接口述):一个数组求和,每个元素都在int范围内,保证最终的结果在int范围内,但是中间会溢出,怎么实现13. 反问
查看25道真题和解析
点赞 评论 收藏
分享
评论
6
63
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务