Java
进阶预计进阶 2-3 个月星团 编程语言
岗位需求
0 核心 · 0 加分
在职岗位将其列为技能要求
核心岗位薪资带
—
核心要求岗位的月薪区间
需求趋势
上升 0稳定 0收缩 0
核心要求岗位的趋势分布
面试题库
高频真题 · 参考答案随题展开1. JVM 运行时数据区有哪些?各区域存放什么?
线程私有的三块:程序计数器记录当前字节码行号,是唯一不会内存溢出的区域;虚拟机栈由栈帧组成,帧内保存局部变量表、操作数栈与动态链接,递归过深抛 StackOverflowError;本地方法栈服务于 native 方法。线程共享的两块:堆存放对象实例与数组,是 GC 主战场,分为新生代(Eden 加两个 Survivor)与老年代;方法区(JDK8 后由元空间实现,使用本地内存)存放类元信息、运行时常量池与 JIT 代码。另注意字符串常量池在 JDK7 起移入堆。直接内存虽不属于运行时数据区但 NIO 会大量使用。答题时结合对象创建流程(类检查、分配、TLAB、零值、设头、init)说明各区域协作,并给出每种 OOM 对应区域即完整。
2. 常见垃圾回收算法与收集器有哪些?
基础算法有标记清除(简单但碎片化)、标记整理(老年代无碎片但移动成本高)、复制算法(新生代标配,空间换时间)与分代收集(按对象存活特征组合前述算法)。收集器演进:Serial 单线程适合客户端;Parallel Scavenge 与 Parallel Old 吞吐优先;CMS 并发标记清除低停顿但内存碎片与并发失败问题已废弃;G1 把堆划成 Region,可预测停顿,JDK9 后默认;ZGC 与 Shenandoah 着色指针或转发指针实现亚毫秒到十毫秒级停顿,TB 级堆可用。判断对象存活用可达性分析从 GC Roots(栈帧局部变量、静态变量、常量、JNI 引用等)出发。答出分代依据(弱分代假说)、各收集器适用场景与自己项目所用收集器的调优参数即为高分。
3. HashMap 的底层实现与扩容机制是怎样的?
JDK8 中 HashMap 由数组加链表加红黑树组成:元素经 hash 扰动(高 16 位异或)后按容量取模定位桶,哈希冲突形成链表,链长达到 8 且数组长度不小于 64 时树化为红黑树,节点删减至 6 时退回链表,把最坏查找从 O(n) 降到 O(log n)。默认容量 16、负载因子 0.75,元素超过容量乘负载因子触发扩容为两倍,JDK8 利用容量为 2 的幂的特性,迁移时只需判断新增最高位比特把链表拆成 lo 与 hi 两组保持相对顺序。非线程安全,并发 put 会丢数据,JDK7 并发扩容还可能成环死循环,替代方案是 ConcurrentHashMap;JDK8 的 CHM 放弃分段锁改用 CAS 加单桶 synchronized,锁粒度到桶头。另外 key 需正确实现 hashCode 与 equals 且不可变。能讲树化阈值与迁移优化即为优秀。
4. synchronized 与 ReentrantLock 有什么区别?
synchronized 是 JVM 层面的内置锁,写法简单、自动释放,JDK6 后引入偏向锁、轻量级锁、自旋与锁消除等优化,日常多数场景性能已足够;锁升级路径为无锁、偏向、轻量级(CAS 竞争)、重量级(互斥量阻塞)。ReentrantLock 是 juc 提供的显式锁:支持 tryLock 尝试获取、可中断获取 lockInterruptibly、公平锁构造参数、多条件变量 Condition 精确唤醒,但必须在 finally 中 unlock,且可配合 AQS 理解 state 与 CLH 队列。选择上默认 synchronized,需要超时、中断、公平或多个等待集时用 ReentrantLock。AQS 是两者之外的高频追问:以 volatile int state 与 FIFO 等待队列实现独占与共享模式,是 ReentrantLock、Semaphore、CountDownLatch 的基座。对比维度齐全并给出选型结论即完整。
5. 类加载过程与双亲委派模型是怎样的?
类加载分五阶段:加载(读取字节码生成 Class 对象)、验证、准备(静态变量分配零值)、解析(符号引用转直接引用)、初始化(执行 clinit 静态初始化块,JVM 保证线程安全)。双亲委派指类加载器收到请求先委派给父加载器,只有父级无法完成才自己加载,层级为 Bootstrap 加载核心库、Extension 或 Platform、Application 加载 classpath、自定义加载器。价值是安全(核心类不被篡改,防止用户自定义 java.lang.String 生效)与避免重复加载。打破双亲委派的场景:SPI 用线程上下文加载器让核心库回调应用代码、热部署、Tomcat 每应用独立 WebappClassLoader 隔离。自定义类加载器需重写 findClass 并可重写 loadClass 改变委派。答出五阶段顺序、委派流程与至少两个打破案例即优秀。
官方文档
1 条Oracle 官方 Java 学习与文档入口,版本特性一手资料
推荐教程
3 条中文基础语法与集合框架速览,适合快速入门
高星中文开源知识库,面试八股与原理讲解体系完整
中文系统化知识库,集合并发到框架面试要点齐全
推荐课程
1 条免费精品互动课程,从零到面向对象与流式 API
上手实践
1 条免费编程练习加导师评审,巩固语言与集合用法
难度档决定星等与难度分权重(入门 1 / 进阶 2 / 精通 3);学习资源由编辑部遴选并持续维护, 经验心得欢迎在上方「知识分享」区署名分享。

