面试记录 part2

93 阅读5分钟

主要是Java基础 框架原理

  1. 详述线程池构造方法有哪些各有什么用、ctl、allowCoreThreadTimeOut变量的作用,初始化阶段、大量提交任务阶段、执行完所有任务阶段这写过程。(addWorker过程和其它部分回答得不错 runWorker getTask的一些细节回答的不好。线程池是Java躲不开的问题 网上有很多答案不再细说。)

  2. HashMap数据结构,resize过程,如果多线程去操作会出现哪些问题,1.7和1.8有什么变化,既然提到了红黑树那么来聊聊它和BST、AVL各自有啥特点有啥区别,说一下平衡过程(ok。这个是基础内容网上一大把答案不再细说)

  3. 接下来聊聊concurrenthashmap怎样保证线程安全的1.7和1.8区别(ok)

  4. 线程有几种状态,sleep wait 区别(ok)

  5. synchronized Lock区别,synchronized工作原理对象头、JVM中锁的优化,再聊聊并发包的AQS、公平锁非公平锁 读写锁、CAS和底层的unsafe(ok)

  6. JVM内存结构,堆的内存结构哪些是线程共享的呢,使用过javap命令吗结合这个命令你个谈谈对JVM内存各个区的理解。调优相关。(ok)

  7. 聊一下GC,可达性分析算法、哪些对象可以作为GC ROOT,根据新生代老年代特点的不同来说一下他们适合使用哪些垃圾回收算法。对比一下标记清除和标记整理。(ok)

  8. 类加载器,双亲委派,安全沙箱机制(ok)

  9. 聊聊IO吧,BIO、NIO,IO模型,jvm怎样实现NIO的呢(ok。还好之前略看了一下JVM这一块的c c++代码。多路复用 非阻塞之类的就不细说了。说几个关键点,IO模型参照《unix网络编程》。select、poll、epoll。fcntl)

  10. 巴拉巴拉聊项目牵扯出一堆问题 一致性hash算法、分布式事物、Service Mesh实践、rabbitmq(基本ok)

  11. TCP滑动窗口 ACK机制。(ok)

  12. zuul、hystrix、feign工作原理,springmvc工作原理(ok)

  13. 举例说明spring中使用到的设计模式(ok,掘金有这个文章)

  14. git使用规范、gitflow(ok)

  15. dubbo 相关问题(ok)

二面 golang

  1. Golang 的并发模型(回答的一般 M、P、G)

  2. 聊聊gin源码 路由、group、middleware &设计模式(路由的实现用到了前缀树这个回答得不好 ,其它ok)

  3. grpc4种调用方式,你看过grpc golang版源码 client --> server这个过程你讲一下。protobuf协议 GRPC 性能优化,http2 (ok,这个印象深刻在上家公司时候还做过分享)

  4. cap原理,注册中心选型AP or CP。

  5. etcd是CAP的哪种?etcd数据一致性算法是?详述raft协议,发生分区隔离之后会怎样,隔离恢复之后怎样保证数据一致性?(ok,说raft之前先说了一下Paxos 后来引出了Raft 对比一下,然后开始讲raft各种情况 极力推荐去这里看看 raft.github.io/)

  6. 你说看过源码那聊一下gomicro吧(说了一下各种组件每种适合做什么事,讲了一下我们的项目中微服务用到了哪些,上家公司gomicro技术栈是我推动的所以这里回答得还可以。)

  7. 聊一下你们没有采用gomicro的时候你们的微服务是怎样实践的(注册中心发现用的etcd,lease续期、服务降级、限流、熔断、缓存、一致性hash等负载均衡策略实现,GRPC,golang版rabbitmq客户端&断网重连。不像spring cloud或gomicro很多现成的可以用这些都是手撸 当然这是我的团队共同完成的,这过程中收获蛮多所以不要排斥学习另一门语言或者技术栈 往往会对自己打开一扇窗)

  8. golang压测pprof,火焰图,结合项目讲一下架构推演 性能提升点(OK)

  9. 你们项目结构和依赖管理(OK,这里不得不吐槽一下 godep、glide真的不如maven好用)

  10. 遇到过哪些坑(使用etcd过程中遇到的坑,使用不当造成的协程泄露以及如何避免的,watch、lease、空间压缩、等)

  11. 使用golang你印象深刻的是啥(协程,chan、select这是绝壁是巨好用的,defer,panic&reverse)

  12. golang编码规范、日志规范(这里要提一句规范很重要,架构演进的时候做重构深有体会,然而并没有很统一的规范像Java阿里规范那种,对于分包官方并没有给出一个推荐的目录划分方式 所以google然后根据自身体会制定了一个团队内部规范 后来发现掘金有一篇文章有所共鸣并严重赞同 draveness.me/golang-101 日志框架并没有Java直接采用slf4j 下面用 log4j2或logback那么果断,选之又选决定用logrus,团队的QL同学根据需求定制了)

三面 综合

  1. kafka工作原理、零拷贝、分组协调器工作原理、offset相关问题

  2. 链路追踪 SkyWalking、zipkin 各自特点和实现原理,Java探针

  3. mysql 锁、索引、事务,大数据量优化 分表分库方案

  4. redis线程模型 skiplist ziplist数据结构,持久化方案 rdb快照备份的过程(copy-on-write这个回答的不好 我只知道Java的copyonwrite ,Linux fork进程具体操作不清楚)。淘汰策略,缓存穿透 大规模失效解决方案

  5. 手写代码算法题 假设有两种操作符*和- *代表×2 -代表减一,给你两个数 a,b 要求计算出从a经过这两种运算得到b最少多少步 (ok,算法不是我强项,这题刷算法的时候也没做过还好给的比较简单,大概10多秒有思路 几分钟写了一下不太完整 让我讲了讲思路 使用二叉树去做)

  6. 聊一聊感兴趣的技术 未来发展方向(技术方面)