背景
Java5年,面试岗位业务架构,P6++ 到 P7,可能在基础架构部会评级略低,核心C端业务部门会略高。面向公司,都是一线各个行业前三的公司的核心部门。
核心:深到细微处,也要有全局视野。
下面所有的回答,仅为核心点,并不代表全面,需要自行搜索或者debug或者源码阅读。
任何问题都要有几问。
- 这是什么,细节到数据结构,宏观到整体设计,我是否能清晰;
- 为什么这么设计,因为什么样的原因;
- 同等的产品有什么差异,优缺点在哪里;
- 如果我们来实现,画图表达自己的想法,并指出关键点。
Jvm
问:内存模型
答:堆,栈等等,巴拉巴拉。
问:gc算法有哪些
答:复制整理,标记清除,具体执行过程如何,参数如何。
问:cms执行过程
答:初始标记(stw) -> 并发标记 -> 并发预清理 -> 重标记 -> 并发清理 -> 重置。
问:mirror gc 和 full gc的区别
答:区域不同,mirror gc覆盖young区,full gc则覆盖young + old;gc算法不同,mirror gc为复制整理算法,full gc为标记清理,GcRoot是什么,哪些对标是GcRoot
问:jdk1.8 与 1.7 上述问题发生了哪些变化
答:自行搜索
Java基础
- HashMap的数据结构如何,扩容过程,与ConcurrentHashMap的对比区别,在jdk1.8下ConcurrentHashMap做的改动有哪些?
- 偏向锁,轻量级锁,自旋锁,重量级锁
- 线程的状态有哪些,分别是什么动作会触发,源码备注有
- 线程池的参数含义,以及一直push task,线程池整体的变化过程
- Java的内存屏障
- Threadlocal是什么,源码如何实现
- CountDownLatch 和 CycliBarriar的区别,源码如何实现
Mysql
- acid和事务隔离级别,
- 锁机制
- mvcc机制
- 索引的数据结构,优化方式
- 多事务并行执行过程
算法
- 快排的实现,时间复杂度
- 单链表,双向链表 - ArrayLis, linkedList,RandomAccess,LinkedHashMap
- kmp,
- 堆栈,
- 栈算法实现,数组+链表实现,符号匹配,中缀表达式转成后缀表达式 快排,
- 堆排序,大顶堆,小顶堆,最后位置的数据替换,上移。
- 归并排序,
- 广度优先搜索,深度优先搜索, stack,queue
- 字典树,哈希表
- bst, avl, b, b-
- 动态规划
rockemtq-中间件
- 整体设计图
- 通信方式,以及通信的数据结构定义
- 内存,磁盘文件存储的数据结构
- 源码 + 文档阅读
redis-中间件
- 提供了哪些数据结构,如何用基础数据结构实现的
- string的压缩过程,ziplist的数据结构定义
- list 采用了fastlist
- zset 采用了跳表等等
- redis为什么快?极限的数据结构压缩优化,多路复用,单线程依赖action的时间复杂度,新版改成了多线程,但是处理请求依然是单线程。
操作系统
- 用户态与内核态的切换过程
- 多路复用的含义和区别,select, epoll, kqueue
项目
- 单体项目的复杂度以及在其中承担的角色
- 项目集群的系统设计方案,系统间如何通信,交互,微服务拆分,边界定义
- 单体项目指标,tps,数据存量,数据增量都能体现项目的规模与复杂度
- 要提前准备至少2个自己主导的项目,最好能把上述体现比较完整的呈现出来,这个能决定级别
其他
强调一下。深切的感受到,很多人仅知道表面,很少有人看源码和文档,切勿浮躁,在面试中不经意间提出你看过的源码部分,设计优缺点,如果能提到版本升级迭代中解决的问题,更能再上一步,这些才是能决定级别和待遇。 还有一点就是你的项目的规模,指标。tps,数据存量,数据增量。
- 源码读的更深入一些
- 官方文档看的更频繁一些
- 书读的更多一些(一定要看作者是否牛笔,不然浪费时间)
- 项目中更主动一些,多承担
拿offer不难,难的是拿到自己期望的级别和待遇。祝大家面试顺利。