前言
了解 JVM 是对 Java 开发人员的基本要求,JVM 的相关内容自然也成了现在 Java 程序员面试的重要考点。不过估计很多小伙伴和我一样,长时间醉心于 CRUD,却忘了去了解一下更底层、更基础的东西,殊不知这些才是决定你能在这条路上走多远的关键因素,那接下来我们就一起来深入学习一下看似神秘的 JVM 吧。JVM 总体来看内容还是很多的,我会把最重要的内容介绍给大家,不过如果你有时间和精力的话,还是推荐你去看一下《深入理解Java虚拟机》这本书,确实是有口皆碑。本文也会引用很多此书的内容并加上我自己的理解,如果你坚持看下去的话,相信会有很大的收获。
首先对 JVM 做个简单的介绍,JVM 是 JDK 的一部分,《Java 虚拟机规范》(The Java Virtual Machine Specification) 是平行于《Java 语言规范》(The Java Language Specification)的一套独立的规范,不同的公司对其有不同的实现 (类似于一个接口被不同的类实现),比较著名的 Java 虚拟机实现版本有 HotSpot、JRockit 和 J9 等。
一面
-
介绍一下自己
-
问项目经历, 聊"数据同步"
-
接着聊上了 K8S 的项目
-
有没有什么钻研得比较深得技术?(大佬:kubernetes, golang, prometheus, java)
-
kubernetes 的架构是怎么样的?
-
这个问题很大,拆成 apiserver、controller、kubelet、scheduler 讲了一下
-
golang 与 java 的比较
-
这个问题又很大,当时主要对比了 vm、协程支持、面向对象和泛型的区别、以及自己对各自使用场景的一些理解
-
golang 的 gc 算法
-
知道是三色标记,不过细节说不上来
-
从无限的字符流中, 随机选出 10 个字符
-
没见过也没想出来,查了一下是蓄水池采样算法,经典面试题,没刷题吃亏了
-
怎么扩展 kubernetes scheduler, 让它能 handle 大规模的节点调度
-
单节点提速:优选阶段随机取部分节点进行优选;水平扩展 scheduler 节点,pod 做一致性 hash 来决定由哪个scheduler 调度
-
你有什么想问我的?
一面其实有点僵,大佬自己完全没放开,面试官对大佬的回答没有什么反馈和深入,都是"哦好的"然后就过了。所以大佬当时面完觉得自己其实已经挂了(要是对候选人不感兴趣,有时候也就问完问题走个过场溜了),后来收到二面电话着实吃惊了一下。
二面
-
先聊了聊项目
-
给 Prometheus 做了哪些改动?
-
自研配置中心, 具体做了哪些内容?
-
有用过 MySQL 的什么高级特性吗?
-
这里不太理解,我问什么算高级特性,面试官就切换到了下一个问题
-
配置中心的核心数据表是怎么设计的?
-
为什么在业务里用 Redis, Redis 有什么优点?
-
单线程:并发安全;高性能;原语与数据结构丰富;采用广泛,踩坑成本低
-
对 Redis 里数据结构的实现熟悉吗?
-
说了一个 zset 跳表
-
用过 Redis 的哪些数据结构, 分别用在什么场景?
-
Java 初始化一个线程池有哪些参数可以配置, 分别是什么作用?
-
自己写的 Java 应用调优过哪些 JVM 参数, 为什么这么调优?(这个问住了&#x