JVM:从黑箱到透明
写Java的人天天和JVM打交道,却鲜有人掀开引擎盖。对象在Eden出生,经历Minor GC在Survivor间辗转,年龄够了晋升老年代。类加载的双亲委派模型,保证核心类不被篡改。字节码是JVM的真正语言,javap -c一敲,每行代码的真身毕现。不懂JVM,调优就是碰运气;懂了JVM,OOM和Full GC都是可读的日志。那些深夜救火的人,靠的不是重启,是jstat、jmap和GC日志里读出的因果链。工欲善其事,必先利其器,JVM就是Java开发者最该磨利的器。
并发编程:JMM与AQS的硬核
volatile保证可见性却不保证原子性,synchronized的锁升级从偏向锁到轻量级再到重量级,AQS用CLH队列和state变量撑起ReentrantLock、CountDownLatch、Semaphore。并发不是开几个线程,是理解内存可见性与指令重排。happens-before规则像交通法规,违反它,程序就在数据竞争的悬崖边跳舞。CAS的ABA问题、线程池的拒绝策略、ThreadLocal的内存泄漏,每一个坑都埋着对底层无知的血泪。不积跬步无以至千里,并发底层就是那第一步。
Spring底层:IoC与AOP的真相
Bean的生命周期从实例化、属性填充、初始化到销毁,循环依赖靠三级缓存化解。AOP的本质是动态代理,JDK代理靠接口,CGLIB靠继承。事务传播行为在代理链中层层传递,@Transactional失效的八种场景,每一种都指向对代理机制的误解。不懂Spring源码,你只是配置工,不是开发者。框架的魔法,九成来自反射、代理和回调,看穿了,便不再神秘。知其然知其所以然,才是从搬运工到工程师的跃迁。
MySQL与Redis:数据层的根基
B+树索引为什么用叶子节点存数据,MVCC如何用undo log和read view实现快照读,间隙锁怎样在可重复读下防止幻读。Redis的持久化RDB与AOF各有取舍,缓存穿透、击穿、雪崩的解法背后是对数据一致性的权衡。数据库不懂底层,SQL写死也调不出高性能。一条慢查询,可能拖垮整个服务;一次缓存失效,可能引发雪崩。数据层是系统的地基,地基不牢,上层再花哨也是危楼。
底层技术的回报:从救火到防火
学底层不是为了面试时背八股,而是为了生产环境里那关键的十分钟。别人对着堆栈发愣,你能定位到AQS的等待队列;别人重启了事,你能从GC日志里找到内存泄漏的根因。底层技术的回报,不在面试题,而在生产环境的深夜。荀子说,不积跬步无以至千里。JVM、并发、Spring、数据库,每一层都值得深挖。月薪30K不是终点,是你能用底层知识解决别人解决不了的问题时,市场给的定价。那些偷偷学的人,只是比你早一步承认:抽象层再厚,终究要有人下去看看。