作为 Java 程序员,java 尚学堂和尚硅谷,看完我工资从 12K 变成了 20K
一面(个人感觉回答得还不错)
1. 自我介绍 2. 说项目,项目问的非常深(本人提到之前做过的一篇关于 FULL GC 的问题定位和优化的项目以及一个多并发的项目)
2.1 对于自己产于过项目的系统定位是否清楚?2.2 对于系统的各个模块是否清楚?2.3 每个接口的 tps?2.4 对于上下游系统的依赖?2.5 对于使用到的中间件、框架是否清楚?
3. 你觉得你做的项目中最有亮点的事情?4. memcache redis 同类中间的差异、优缺点?使用注意点有哪些?
memcache 可以存储的数据类型只有字符串类型,而 redis 可以存储字符,list,sorted List,hash 数据类型的数据;memcache 不支持数据持久化,redis 支持 RDB,AOF 持久化;memcache 不支持集群,redis 支持 redis-cluster 集群
5. redis 分布式锁说说
我提到了 redis 的 setnx()方法,以及使用 redis 的 KV 结构,lock 作为 key,key 对应的 value 使用 map 结构,map 中使用请求 requestId 作为 map 的 key,过期时间作为 map 的 value,获取锁使用 cas 算法,比较时间是否过期来获取锁和释放锁
6. TCP,UDP7. 多并发项目的并发量,有没有压测过,以及 QPS,请求的消息量太大,使用自己创建的任务队列会不会使内存爆?8. Redis 集群主从数据同步
主从集群实现了数据的读写分离,主服务器负责读写,偏重写,从服务器只负责读。主服务器启动之后向从服务器发送日志文件,从服务器根据日志文件进行数据的更新,之后如果主服务器有写操作,也会向从服务器发送相应的写操作
9. Zookeeper 实现选举的原理
zk 的选举过程中其起始所有结点的状态为 looking,当某个结点的选票超过所有结点数的一半,该结点就会成为 leader,结点状态为 leading,其他结点会成为 followers,结点状态为 following。选举的依据是(sid,zxid)数据,sid 代表结点的 ID,zxid 代表事务 ID,选举过程中每个结点第一轮选举会选举自己作为 leader,将(sid,zxid)发送给其他结点,其他结点收到数据(sid,zxid)与自身的数据做比较,如果 zxid 比自身 zxid 的要大,则直接选举当前结点;如果小于,坚持选举自己;如果 zxid 相等,比较 sid 哪个大,大者作为 leader。
10. 说说分布式(我说的是 Dubbo)11. 数据库事务,分布式数据一致性如何实现?
读者可以了解一下 ZAB 协议,我大概就是围着 ZAB 协议说的
12. SpringIOC,SpringAOP
我简单说了说 IOC,AOP 的原理,以及原理依赖的模式
13. 数据库事务的隔离级别
四大隔离界别:Uncommitted-read Commited-read Repeated-read Serializable 分别针对数据库脏读,不可重复读,虚读问题
14. 谈谈 RPC
RPC 远程调用,说了说原理,使用到的组件,以及 RPC 主要的任务:序列化,传输数据,方法调用(方法对应的 ID)
15. 算法题:笔试题-最短路径问题(这道题是通过的)某物流派送员 p,需要给 a、b、c、d4 个快递点派送包裹,请问派送员需要选择什么的路线,才能完成最短路程的派送。假设如图派送员的起点坐标(0,0),派送路线只能沿着图中的方格边行驶,每个小格都是正方形,且边长为 1,如 p 到 d 的距离就是 4。随机输入 n 个派送点坐标,求输出最短派送路线值(从起点开始完成 n 个点派送并回到起始点的距离)。
我的做法是使用排列算法,将所有的情况排列出来,计算最短路径
二面(个人感觉回答的特别垃圾,六道问题回答了两道)
1. 自我介绍 2. 怼项目,各个角度刁难 3. FULL GC 问题排查工具
我做项目时其实没有使用什么工具,就是用 Linux 命令 TOP,TOP 交互命令 1,H;jsatck,jstat 以及 JVM 的相关参数和 JVM 日志的查看
4. 从事开发遇到最具有难度的问题 5. Spring 事务,嵌套事务
这道题其实我是被问懵了,我回答得相当不好,一直回答事务隔离那一块,面试完我总结了一下有关 Spring 事务相关知识点
6. 面向接口编程的好处是什么
问的问题太抽象,我回答不好,面试官说不够完善
7. 数据库两个 insert 同时操作同一张表,第一个线程操作一半,问第二个线程会发生什么?
我回答的稀巴烂,下来查了一下,大概就是说这里涉及到的锁是间歇锁,读者可以看看相关知识
8. 说说死锁
举个例子,两个线程 1 和 2,两个锁 a 和 b,线程 1 拿到 a 锁后申请要 b 锁,而同时线程 2 已经拿到 b 锁,要申请 a 锁,两个线程之间陷入僵持状态
最后
小编利用空余时间整理了一份《MySQL 性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。
关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。
这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!
评论