深入解析2017年互联网大厂面试核心考点,涵盖JVM原理、并发编程、Spring生态及分布式架构,助您构建完整的后端知识体系。
在2017年,Java后端开发领域正经历着从传统SSM框架向微服务架构转型的关键时期。对于求职者而言,仅仅掌握CRUD操作已无法满足大厂的需求。Java 面试宝典2017旨在通过梳理当年的技术热点,帮助开发者建立系统的知识框架。这一年,Spring Boot的普及、Dubbo的微服务实践、以及Docker容器化技术的兴起,构成了面试考察的三大支柱。
我们注意到,面试官越来越倾向于考察底层原理而非API的使用。例如,不再询问“如何配置Spring”,而是询问“Spring Bean的生命周期及扩展点”。本页面将围绕这些核心变化,为您提供深度解析。
集合框架、反射机制、IO/NIO、JUC包是必考基础。重点在于理解底层数据结构(如HashMap的扩容机制、ConcurrentHashMap的Segment设计)。
JVM内存模型、GC算法、类加载机制是区分初级与高级开发者的分水岭。需掌握如何通过JStack、JMap等工具排查线上问题。
理解CAP定理、BASE理论,熟悉Redis缓存策略、MQ消息队列削峰填谷场景,以及MySQL索引优化策略。
JVM(Java Virtual Machine)是Java技术体系的基石。在面试中,JVM相关的问题通常占据了30%以上的权重。理解JVM不仅有助于通过面试,更是解决线上OOM(OutOfMemoryError)和CPU飙高问题的关键。
Java堆(Heap)是JVM中最大的一块内存区域,被所有线程共享,主要用于存放对象实例。Java方法区(Method Area)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2017年主流JVM(如HotSpot)采用分代收集理论。年轻代采用复制算法,老年代采用标记-清除或标记-整理算法。
| 算法名称 | 优点 | 缺点 | 适用区域 |
|---|---|---|---|
| 标记-清除 | 无需移动对象 | 产生内存碎片,效率较低 | 老年代 |
| 标记-整理 | 无内存碎片 | 对象需移动,效率略低 | 老年代 |
| 复制算法 | 无碎片,效率高 | 内存利用率仅50% | 年轻代(Eden区) |
Serial收集器、ParNew收集器、Parallel Scavenge收集器主要用于年轻代;Serial Old、Parallel Old、CMS(Concurrent Mark Sweep)、G1收集器用于老年代。2017年,G1收集器因其可预测的停顿时间模型,逐渐成为大内存应用的首选。
高并发是Java后端的核心竞争力。Java 5引入的java.util.concurrent(JUC)包极大地简化了多线程编程。面试官常问:线程池的核心参数有哪些?ThreadLocal的原理是什么?
使用ThreadPoolExecutor创建线程池时,需关注以下七个核心参数:
public ThreadPoolExecutor(
int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 空闲线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue workQueue,// 任务队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler) // 拒绝策略
从synchronized关键字到java.util.concurrent.locks.Lock接口,锁的性能和灵活性不断提升。
Spring和MyBatis是2017年Java企业级开发的标准配置。理解其设计模式是源码级的关键。
IoC(控制反转)通过DI(依赖注入)实现对象解耦。Spring容器管理Bean的生命周期:实例化→属性赋值→初始化→销毁。
AOP(面向切面编程)基于动态代理实现。JDK动态代理针对接口,CGLIB针对类。Spring Boot默认使用CGLIB。AOP常用于事务管理、日志记录、权限校验等横切关注点。
1. 读取配置文件,创建SqlSessionFactory。
2. 通过SqlSessionFactory创建SqlSession。
3. SqlSession执行Mapper接口方法,底层通过Executor执行SQL。
4. Executor使用StatementHandler操作数据库,ParameterHandler设置参数,ResultSetHandler封装结果。
MyBatis的一级缓存基于PerpetualCache(HashMap),作用域为SqlSession;二级缓存基于Namespace,需手动开启。
数据库是后端系统的瓶颈所在。索引优化、SQL调优、分库分表是面试高频考点。
MySQL InnoDB引擎默认使用B+树索引。相比B树,B+树非叶子节点只存储键值,不存储数据,使得单次IO能容纳更多键值,树高更低(通常3-4层),查询效率更稳定。
数据库定义了四种隔离级别:
使用EXPLAIN分析SQL执行计划,关注type(访问类型)、key(实际使用的索引)、rows(扫描行数)。避免在索引列上做计算、函数操作或隐式类型转换。
随着业务量增长,单体架构难以支撑,分布式成为必然选择。2017年,Dubbo、Redis、RabbitMQ/Kafka是主流组件。
Redis不仅是缓存,还可用于计数、排行榜、分布式锁等场景。
在秒杀场景中,MQ(如RabbitMQ、Kafka)用于异步处理,降低数据库压力。需关注消息丢失、重复消费、顺序消费等问题。
Spring Boot 1.5.x成为主流,进一步简化了微服务开发,配合Spring Cloud实现了快速搭建分布式系统。
阿里将Dubbo开源至Apache基金会,国内互联网公司广泛采用Dubbo作为RPC框架,替代了部分Hessian/Tribes方案。
随着Kubernetes等云原生项目用Go重写,Go语言在高性能微服务领域对Java构成了一定挑战,Java开发者开始关注Go或混合架构。
JDK 9正式发布,引入Module System(Jigsaw),旨在解决Java应用臃肿问题,但生态兼容性挑战巨大。
以下问题基于2017年搜索引擎大数据统计得出,是求职者必须掌握的“送分题”与“送命题”。
线程安全:HashTable线程安全(方法同步),HashMap线程不安全。
键值允许:HashTable不允许null键/值,HashMap允许一个null键,多个null值。
性能:HashMap性能更高,因为无同步开销。
初始容量:HashMap默认16,HashTable默认11。
死锁是指两个或多个线程互相持有对方需要的资源,导致永久阻塞。排查工具:jstack生成线程dump,查看是否有"deadlocked"标记。预防策略:固定资源申请顺序、使用tryLock超时机制。
singleton(单例,默认)、prototype(原型)、request、session、global-session。注意:Web环境下才支持后三种。
浅拷贝只复制基本类型和引用地址,深拷贝递归复制所有对象。Java中实现Cloneable接口并重写clone()可实现浅拷贝,深拷贝需序列化或递归复制。
Java Heap Space:对象过多,GC回收不了。
Java Metaspace:类信息过多。
Direct buffer memory:NIO直接内存溢出。
GC overhead limit exceeded:GC回收效率过低。
接口只能定义方法签名(Java 8前),抽象类可包含实现;接口支持多继承,抽象类单继承;接口侧重“has-a”能力,抽象类侧重“is-a”关系。
先更新数据库,再删除缓存(而非更新缓存,避免并发更新导致脏数据)。若需强一致,可使用Canal监听Binlog异步删除缓存。
三次握手:SYN → SYN+ACK → ACK。防止历史连接请求突然到达服务器。
四次挥手:FIN → ACK → FIN → ACK。确保双方数据发送完毕。
优势:独立部署、技术栈灵活、故障隔离、易于扩展。
劣势:分布式复杂性(网络延迟、数据一致性)、运维成本高、调试困难。
Java泛型在编译后会被擦除,替换为原生类型(Object或上界)。因此运行时无法获取泛型具体类型。可通过TypeToken等库在运行时保留泛型信息。