1
young1lin 2021-01-15 09:40:23 +08:00
大多数情况下,人家只要你了解基本的 JVM 知识,其实只是要你看过《深入理解 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 的还有什么要问的吗? 后面两本书,说实话我没看,没必要,最后的故事转自一个美团的面试的人的,那个美团的一个小组组长说看看人家,自己写了个虚拟机,真牛啊(窃喜,这本书没什么人了解)。 |
2
young1lin 2021-01-15 10:18:32 +08:00
什么架构师,专家,其实要会的挺多的,不过你中间件的内容学的多了。或者数据库方面的( MySQL,Redis,Hive,HBase 等等)学多了,你就会发现,大体上的内容都是差不多的。
还有什么常用的框架基本的内容啊,比如 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 中就有体现,超过一定量级的查询结果,就用快排。还有限流算法,滑动窗口之类的,不过这些都由框架帮你搞定了。 |