类加载器详解(重点)
双亲委派类加载请求先委派父加载器,父无法加载才由子尝试。保证 java.lang.String 等核心类统一,防止用户伪造核心 API。 三层加载器Bootstrap(C++)→ Platform(Extension)→ Application。线程上下文类加载器(TCCL)常用于 SPI,如 JDBC 驱动加载。 何时破坏委派Tomcat 隔离 Web 应用、OSGi 模块化、热部署需要平行或自定义委派。实现 loadClass 重写 findClass 加载字节码即可,注意 defineClass 安全边界。 排查ClassNotFoundException 是加载阶段找不到;NoClassDefFoundError 是初始化或链接后运行时缺失,栈含义不同。 课堂外的思考学习「类加载器详解(重点)」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK...
类加载过程详解
五阶段加载:读字节流生成 Class 对象。验证:文件/format/字节码/符号引用合法性。准备:静态变量零值分配。解析:符号引用转直接引用(可延迟)。初始化:执行 clinit。 初始化时机new、反射、子类触发父类、主类、MethodHandle 等。接口 default 方法有特例。主动引用才初始化,被动使用父类静态字段不会初始化子类。 例子123class Parent { static { System.out.println("P"); } }class Child extends Parent { static { System.out.println("C"); } }// 仅 Child.staticField 访问顺序:P → C 理解顺序有助于解释静态块死锁等诡异问题。 课堂外的思考学习「类加载过程详解」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这...
类文件结构详解
文件骨架魔数 CAFEBABE → 版本号 → 常量池(Utf8、Class、NameAndType 等)→ 访问标志 → 类/父类/接口索引 → 字段表 → 方法表 → 属性表(Code、LineNumberTable)。 为什么学结构读懂字节码才能理解反射、动态代理、Lambda 生成类;排查 NoClassDefFoundError 时也常要确认常量池引用是否有效。 动手1javap -v Hello.class | head -40 对照输出找 constant_pool 里的 #1=#2+#3 形式,建立「符号引用 vs 直接引用」的直觉。 课堂外的思考学习「类文件结构详解」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary source,而不是凭记忆...
JVM 专题:内存区域、类加载、垃圾回收、参数调优与线上排查
模块串联先建立运行时数据区全景,再看 class 文件与类加载双亲委派;然后深入 GC 算法与收集器,配合常用 JVM 参数做压测;最后用 jcmd、MAT、Arthas 走一遍线上排查流程。 工具箱jps/jstat/jmap/jstack 是 JDK 自带;VisualVM、GCeasy 看 GC 日志;heap dump 用 MAT 找泄漏 dominator tree。 实践建议本地用 -Xlog:gc* 打开统一日志(JDK9+),调一次 Young GC 频率与 Full GC 触发条件,比背收集器名字更有体感。 课堂外的思考学习「JVM 专题:内存区域、类加载、垃圾回收、参数调优与线上排查」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary sour...
最重要的JVM参数总结
堆与栈-Xms/-Xmx 堆初始/最大; -Xss 线程栈。生产常设 Xms=Xmx 稳定 GC。 元空间-XX:MetaspaceSize/-XX:MaxMetaspaceSize 限制类元数据,防止动态代理/generate 类撑爆。 GC 日志(JDK9+)1-Xlog:gc*,gc+age=trace:file=gc.log:time,uptime,level,tags OOM 行动-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap.hprof 保留案发现场;配合 Error 文件 -XX:ErrorFile。 调参先测量后修改,避免迷信网上模板。 课堂外的思考学习「最重要的JVM参数总结」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请...
大白话带你认识 JVM
JVM 是什么Java 源码编译成字节码,JVM 负责解释/ JIT 执行,并提供自动 GC、线程调度、安全沙箱。一次编写到处运行,靠的是针对不同 OS 的 JVM 实现。 与 JRE/JDKJDK = JRE + 开发工具;JRE = JVM + 核心类库。现在 Oracle 发行版趋向整包 JDK,但概念仍常用。 执行路径javac → .class → ClassLoader 加载 → 字节码验证 → 解释执行,热点代码 JIT 编译成本地代码。理解这条链,后面学内存与 GC 才有落脚点。 类比JVM 像操作系统里的「小操作系统」,管理 Java 世界的内存与线程。 课堂外的思考学习「大白话带你认识 JVM」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 pr...
MongoDB常见面试题总结(下)
下半部分面试聚焦分片键设计、聚合性能与安全模型。线上问题多出在「键选错」和「管道全表扫」。 分片键设计原则选高基数、低频率变更、与查询模式匹配的字段。复合键常把范围查询字段放前。避免单调递增键导致写热点;必要时用 hashed shard key。 块迁移与平衡Balancer 在 shard 间迁移 chunk;迁移期间有短暂性能波动。jumbo chunk 无法迁移需人工拆分或改键。 索引策略1234567// 覆盖常见列表查询db.logs.createIndex({ appId: 1, ts: -1 })// 聚合前尽量 $match 前置并用索引db.logs.aggregate([ { $match: { appId: "a", ts: { $gte: ISODate("2026-01-01") } } }, { $group: { _id: "$level", count: { $sum: ...
NoSQL基础常见面试题总结
NoSQL 不是「不要 SQL」,而是为特定数据模型与扩展模式做了取舍。理解 trade-off 才能正确选型。 NoSQL 解决什么问题当数据量大、结构多变、访问模式清晰且需要横向扩展时,键值、文档、宽列、图四类 NoSQL 各有优势。它们并非不能表达关系,只是存储与查询方式不同。 与关系型的关键差异 维度 关系型 NoSQL 模型 固定表结构 灵活 schema 扩展 垂直+分库分表 原生分片横向扩展 事务 成熟 ACID 多数最终一致,部分有限事务 查询 SQL 标准化 API/查询语言因产品而异 四类怎么选 键值(Redis):缓存、会话、计数、分布式锁。 文档(MongoDB):内容、配置、嵌套 JSON 业务对象。 宽列(HBase/Cassandra):时序、海量稀疏列、写多读少。 图(Neo4j):社交关系、推荐、风控关联分析。 实践建议先用关系型把业务跑通,出现明确瓶颈再引入 NoSQL。跨存储的一致性用 Outbox、CDC 或业务补偿,不要幻想「双写一定一致」。 CAP 与 BASE 怎么落地分布式环境下 ...
MongoDB常见面试题总结(上)
MongoDB 面试上半部分常考架构分层、WiredTiger 与副本集行为。把「写入如何持久、故障如何切换」讲清楚是关键。 架构分层驱动 → mongos(分片路由)→ shard/replica set → 存储引擎。单机开发用 standalone;生产至少三节点副本集。 WiredTiger 要点默认存储引擎,支持文档级并发控制、压缩与 checkpoint。缓存(Cache)命中决定读性能;脏页刷盘与 journal 保证崩溃恢复。 副本集选举心跳检测主节点;不可达触发选举,多数派选新主。priority、votes、arbiterOnly 影响角色。写操作默认要求主确认,可调 w: majority 防 rollback 窗口丢写。 oplog 作用固定大小 capped collection,记录幂等操作,供从节点重放与变更流(Change Streams)消费。 实践建议三节点跨可用区部署;备份用 mongodump+ oplog 或云快照;升级前读 release notes 看存储格式变化。 存储与 journal写操作先写 journal 再 ...
MongoDB 专题:文档模型、索引、副本集、分片、事务与常见面试题
MongoDB 以 BSON 文档为中心,适合 schema 演进快的业务。学习时要把「灵活」与「可控」平衡好。 文档模型要点集合里存 JSON/BSON 文档,字段可嵌套数组与对象。同一集合内文档结构可以不同,但生产仍建议约定 schema 版本,避免字段爆炸。 核心机制 索引:单字段、复合、多键(数组)、文本、地理空间;注意 ES 与 Mongo 文本索引差异。 副本集:一主多从+仲裁,选举 failover;写关注 writeConcern,读关注 readPreference。 分片:按 shard key 水平切分;选好键避免热点与 jumbo chunk。 事务:4.0 副本集、4.2 分片支持多文档事务,但有性能与大小限制。 实践建议12db.orders.createIndex({ userId: 1, createdAt: -1 })db.orders.find({ userId: 123 }).sort({ createdAt: -1 }).limit(20) 大文档拆子文档;高频更...