从 JDK 基础异常到 JVM 内存调优,覆盖空指针、集合遍历、线程安全、BigDecimal 精度等高频问题,每条都经过社区验证。
ConcurrentModificationException 不是多线程专属,单线程遍历集合时直接增删元素一样触发。根因是 iterator 的 expectedModCount 与集合 modCount 不一致。用 removeIf 或 Iterator.remove 即可解决。
应用突然假死,没有异常、没有日志,多半是死锁。用 jstack 抓线程快照,JVM 会直接打出 Found one Java-level deadlock 并列出环上线程。从四个必要条件到锁顺序一致、tryLock 超时一次讲清。
堆内存被对象占满,GC 回收不回空间,抛出 OutOfMemoryError: Java heap space。用 -XX:+HeapDumpOnOutOfMemoryError 留堆快照,MAT 看 Dominator Tree 和 GC Roots,揪出泄漏源头。调大 -Xmx 只是缓兵之计。
递归写错或调用链太深,栈帧把 JVM 线程栈顶穿,抛出 StackOverflowError。它不是堆内存不够,是调用栈深度超限。先查递归到底有没有出口,能改循环就改循环,必要时用 -Xss 应急。
ThreadLocal 在线程池里用完不调用 remove,会慢慢把堆吃满,最终抛出 OutOfMemoryError。根因是 Entry 的 key 是弱引用、value 是强引用,线程复用让无主 value 越积越多。从根因到 try/finally 清理一次讲清。
OutOfMemoryError: unable to create new native thread 不是 Java 堆满了,是操作系统拒绝再创建线程。根因是 ulimit -u、kernel.threads-max 等线程上限,或线程栈吃光 native 内存。调高限制、用有界线程池、减小 -Xss 解决。