何为 Java 高手?
一般 JVM 内存结构(这部分一般是可以看哪里导致的 OOM,进而知道如何解决,比如我两年前接手的老项目经常报 PermGen OutOfMemoryError,就是因为 1.6,1.7 版本的 JDK 永久代分配的内存太少了);
一些基本的启动参数调优(关闭偏向锁,Xms 和 Xmx 根据机器大小,设置成 60%-75% 之间的相等的值,避免大量内存碎片产生等等)
垃圾回收算法(什么代用什么回收算法,为什么要这么用。例如大对象直接进入老年代,是因为 young 区采用的复制清除算法);
什么时候进行回收,是什么 GC ;
查看 dump 文件分析哪段 Java 程序导致内存一直占用很高或者频繁 Full GC 导致 CPU 使用率飙升(一般这个用开源的工具);
几种引用(像 ThreadLocal 里面就用到了 WeakReference );
会 javap -verbose 反编译查看具体 class 的虚拟机指令( invokespecial 之类的),这部分是 Class 文件结构那部分的(一般这个是用来装逼的,或者像 Hikari cp 一样说我这反编译后都比其他的少了几条指令呢,还不高效?);
使用基本 JDK 自带的工具,例如 jstack,jps,jconsole,jmap 等等(我就用过 jstack + top + ps aux 等命令找到具体使 CPU 飙升的堆栈信息,然后改那个 bug );
双亲委派机制(让你知道 ClassLoader 相关的内容,进而知道 static 变量在同一 ClassLoader 加载的时候才是唯一的,而不是 JVM 进程内唯一,后者说法不是特别严谨);
编译到执行过程(什么抽象语法树啊,注解什么时候加进来的之类的),还有编译到运行期间的各种优化( String 类型合并,锁消除,逃逸分析之类的);
理解了这些,差不多了我觉得,比如你在 debug 的时候,点那个 drop frame 就知道什么能跳回之前的方法了,因为 Java 的方法调用就是压栈(虚拟机栈)。
如果你还想了解更多,看《 Java 虚拟机规范》。
如果还不够,你再看看《自己动手写 Java 虚拟机》这个来装逼,你可以按照书上来写个,然后放到你自己的 Github 上,和面试官说,这是我写的 Java 虚拟机,关于 JVM 的还有什么要问的吗?
后面两本书,说实话我没看,没必要,最后的故事转自一个美团的面试的人的,那个美团的一个小组组长说看看人家,自己写了个虚拟机,真牛啊(窃喜,这本书没什么人了解)。
还有什么常用的框架基本的内容啊,比如 Spring Bean 的生命周期,那些 aware 接口,postProcessor 之类的解析注解,Spring 的事件,AOP (其实就是 SmartInstation 这个开头的 postProcessor 拦截,然后再进行 advisor 增强) CGLIB 提升,IoC 容器是怎么解耦 Bean 的,Spring Boot 的自动装配啊,Spring Cloud 定义的抽象 DiscoveryClient 之类的。
例如 SQL 抽象语法树解析,explain 来优化 SQL,WAL ( Write-Ahead-Log == redo,undo ),在内存上更新数据( Buffer Pool,MemStore )然后再根据一定规则刷盘,高效在内存上查询的 Buffer Pool,BlockCache,还有怎样高效构建二级索引(也可以用 Elasticsearch 来做),增量还是全量备份( binlog 等)等等。
**架构师不一定要什么都精,但一定要大部分都懂个大概原理,有前瞻性**。
基本的单体,SOA,微服务演进。六边形架构,整洁架构(又名洋葱架构),CAP,BASE 等等基本的理论知识,还有 FEMA 方法。主从,主备,集群。Cluster,Shard,Partition,Region 等等这些名词。TPC 、PPC 、Reactor 、Proactor 这些。MVC 、MVP 架构,七种负载均衡策略。异地多活,Serverless (这个是下一代开发的方向),Cloud Foundry 平台之类要懂。云原生程序的十二要素,微服务的十一要点(服务发现,路由,容错等等)。进程内与进程间的共 6 种解耦方式。微服务的两种常见拆分方式,根据服务拆分,根据 DDD 来拆分。DDD 又有什么子域,核心域,通用域,支撑域,限界上下文,聚合,聚合根,实体,值对象,领域事件等等。
计算机原理之类的,虽然这个在大学里就学过了,CPU 时间片,进程挂起,上下文切换,管程等等,但是当时谁懂啊,还有什么 CPU 原理,寄存器,奔腾 8086,想到就头大。还有网络基础什么的,基本 Web 安全开启。
其实还有算法方面的,没办法,有些公司(比如字节)要你刷到 LeetCode medium,来考察你是不是“脑子灵活”。其实也有一定用处,比如快排在 MySQL 中就有体现,超过一定量级的查询结果,就用快排。还有限流算法,滑动窗口之类的,不过这些都由框架帮你搞定了。