Skip to content
  • AGP 与 Gradle/Kotlin 版本适配

    这是我踩过 AGP/Gradle/Kotlin 版本不适配的坑后整理的笔记——Android Studio 里最常遇到的一类报错就是版本对不上。记得有次升级 AGP 大版本,一编译满屏红,报错信息还看不懂,网上搜一圈,答案全指着"版本兼容表";对着表把版本调对,编译就好了。后来踩多了发现:报错虽然五花八门,但排查的顺序就那么几条。这篇先把 AGP/Gradle/Kotlin 三者谁管谁讲清楚,再给常用兼容段位和一套排查报错的顺序。

    一、AGP 是什么

    AGP = Android Gradle Plugin(Android

  • interface 与 abstract class 区别

    这是我学习 Java 抽象机制时整理的笔记。接口(interface)和抽象类(abstract class)是面试必问的对比题,也是理解"抽象"的关键——先搞清两者各自的定位,再记区别,最后会选。

    一、解决什么问题:都是"抽象"

    两者都是抽象手段——只描述"是什么/能做什么",不暴露具体实现,让上层代码依赖抽象、不依赖实现(呼应《SOLID 五大设计原则》里的 D 依赖倒置)。

    但它们的语义定位完全不同

  • JVM 是什么:跨平台原理与整体架构

    第一次学 Java 就被一句话洗脑:"一次编译,到处运行"。当时没多想,直到有一次在 Windows 上打完包,丢到 Linux 服务器上直接跑起来——才意识到这背后站着整整一个 JVM。这篇把 JVM 是什么、为什么能跨平台、一个 Java 程序从源码到跑起来经历了什么讲清楚,也作为 JVM 系列的总入口。

    一、解决什么问题:Java 凭什么跨平台

    先看 C 和 Java 的差别(机器码和字节码的完整对比见《[机器码 vs 字节码:程序到底怎么被执行](/programming-fundamentals/compiler/machine

  • Java NIO 详解:Channel、Buffer 与 Selector

    第一次写聊天室的时候,我用传统 IO 写服务端:每个客户端一个线程,300 个人在线就开 300 个线程,内存哗哗涨、线程来回切换,代码还到处是锁。后来换成 NIO——一个线程管住所有连接,代码量反而更少。这篇把 NIO 的三件套(Channel / Buffer / Selector)和非阻塞模型讲清楚,服务端示例是实际跑通的。

    一、解决什么问题:传统 IO 的痛点

    传统 IO(java.io)是流式 + 阻塞的,有两个硬伤:

    1. 阻塞:一个线程 read() 数据,数据没到就卡在那,什么都干不了
    2. **
  • 内存溢出(OOM):类型、定位与实战排查

    有一次版本上线后,凌晨两点线上报警:服务 OOM 崩了。日志里只有一行 java.lang.OutOfMemoryError: Java heap space,没堆栈、没现场。爬起来连上服务器,翻 GC 日志、抓对象直方图,折腾到天亮,最后定位到一个静态缓存——只进不出,对象全被它拽着,GC 收不掉,内存就这么被慢慢占满。

    那次之后我才把 OOM 从头梳理了一遍:Java heap space 只是最表层的一个信号,堆满、GC 空转、类太多、线程耗尽、堆外内存爆掉……每种原因不同,排查路径也完全不同。这篇就把这些类型和排查方法整理出

  • Redis 深入:持久化与过期淘汰

    这是我学习 Redis 持久化与内存淘汰时整理的笔记。入门用法见《Redis 快速入门》,分布式锁见《Redis 分布式锁详解》——本文专注数据怎么不丢、内存满了怎么处理两个生产必问点。

    一、解决什么问题

    Redis 是内存数据库——数据都在内存里,进程一重启,数据全没了。生产环境这是不可接受的(缓存能重建,但登录态、限流计数、分布式

  • Redis 哨兵与集群:高可用与水平扩展

    这是我学习 Redis 高可用时整理的笔记。持久化解决"重启不丢数据"(见《Redis 深入:持久化与过期淘汰》),本文解决"一台挂了怎么办"——主从复制、哨兵故障转移、集群分片三层演进。

    一、解决什么问题

    单机 Redis 有三个问题:

    问题 后果
    单点故障 机器一挂,缓存/锁全没,应用直接雪崩
    读压力 一台机器扛不住海量读
    *容量上限
  • 机器码 vs 字节码:程序到底怎么被执行

    面试被问"Java 为什么跨平台",我背过八股:编译成字节码,JVM 解释执行。但被追问一句"机器码和字节码到底什么区别,C 编译出来的 exe 为什么换台机器就跑不了"——又卡住了。这篇把三层执行模型讲透:源码、字节码、机器码各是什么,谁在执行,为什么要有中间层。

    一、解决什么问题:代码是怎么"活"起来的

    你写的代码是给人看的,但CPU 只认二进制。从"人看的代码"到"CPU 执行的指令",中间隔着一层甚至两层翻译。搞清楚这个过程,很多"为什么"就通了:

    • 为什么 Java 能跨平台、C 不能
    • 为什么 Java 要预热(
  • 计算机网络基础:分层、TCP 握手、HTTP

    这是我学习计算机网络时整理的笔记。作为后端,每天写接口调接口,但"数据从 A 到 B 到底经历了什么"值得系统过一遍——分层、三次握手、HTTP 报文是面试必问三件套。

    一、解决什么问题:网络通信为什么分层

    两台机器通信,要解决的问题层层叠叠:比特怎么在网线传输?数据怎么找到对方?丢了怎么办?传的内容怎么组织?

    不分层:每个应用都要自己实现从网线到协议的每一层——灾难。 分层:每层只解决自己的问题,向上层提供"更友好的服务":

    职责 代表协议
    **
  • 计算机网络

    计算机网络是编程基础的必修课——后端开发每天和 TCP/HTTP 打交道,面试必问分层、握手、HTTP 状态码。点击下面的文章阅读:

    • 计算机网络基础——TCP/IP 四层模型、三次握手/四次挥手、HTTP 报文
    • (TCP 可靠传输、HTTPS 等深入篇整理中)