教程目录
JVM 运行时内存结构?
一、线程私有 程序计数器:记录当前线程执行的字节码行号,唯一不会 OOM 的区域。 虚拟机栈:每个方法调用创建一个栈帧,存局部变量、操作数栈、动态链接。栈深度过深抛 StackOverflowError。 本地方法栈:为 native 方法服务。 二、线程共享 堆:对象实例和数组,GC 主要区域,可
常见的垃圾回收算法?
一、判断对象是否可回收 引用计数法:对象被引用计数 +1,为 0 则回收。无法解决循环引用。 可达性分析:从 GC Roots 出发,不可达的对象可回收。GC Roots 包括栈中引用、静态变量、常量、JNI 引用。 二、回收算法 标记-清除:标记存活对象,清除垃圾。缺点:内存碎片。 标记-复制:内
CMS 和 G1 的区别?
一、CMS 基于标记-清除算法。 以最短停顿时间为目标。 流程:初始标记(STW)→ 并发标记 → 重新标记(STW)→ 并发清除。 缺点:内存碎片、并发阶段消耗 CPU、浮动垃圾、可能 Concurrent Mode Failure 退化为 Serial Old。 二、G1 把堆分成多个 Regi
类加载过程是怎样的?
一、五个阶段 加载:通过类的全限定名获取二进制字节流,在内存中生成 Class 对象。 验证:校验字节码的合法性(魔数、版本、语义)。 准备:为类的静态变量分配内存并赋默认值(零值),final static 在编译期已赋值。 解析:把符号引用替换为直接引用。 初始化:执行 <clinit> 方法,
常见的 OOM 有哪些?
一、Java heap space 堆内存不足,对象太多或内存泄漏。排查:dump 堆快照,用 MAT 分析大对象/泄漏点。 二、GC overhead limit exceeded GC 耗时过长(98% 时间用于 GC 且回收不到 2% 内存)。通常是堆太小或内存泄漏。 三、Java.lang.