03-21 JVM 技术博客 Java (13)《字节码指令》 \*\*核心\*\*:Java编译器生成的JVM指令集,直接操作栈帧,实现逻辑控制。 --- #### \*\*1. 条件判断(条件跳转指令)\*\* - \*\*指令\*\*:\`ifeq\`(等于0跳转)、\`ifne\`(不等于0跳转)、\`iflt\`(小于0跳转)等。 - \*\*实现逻辑 3 0 0
03-21 JVM 技术博客 Java (11)《GC调优 》 1. 什么是 GC? GC(Garbage Collection):JVM 自动回收不再使用的对象内存,避免内存泄漏。 程序员不用手动释放内存,JVM 帮你“打扫垃圾”。 2. 堆内存结构(GC 主战场) 堆 = 新生代(Young Gen) + 老年代(Old Gen) 新生代:新创建的对象先放这 4 0 0
03-21 JVM 技术博客 Java (15)《类加载器》 核心原则:类加载器像“快递员”,双亲委派是“先问上级有没有,没得才自己取”——避免重复派送,保证安全。 1. 概述:类加载器层级 (从上到下,父类加载器 → 子类加载器) Bootstrap ClassLoader(根加载器,C++实现): 加载路径:JAVA_HOME/jre/lib(核心JDK类 2 0 0
03-21 JVM 技术博客 Java (10)《垃圾回收器对比》 核心定位:不同GC针对不同场景优化(吞吐量 vs. 低延迟 vs. 大内存)。 注:CMS在JDK 9+已弃用,G1为默认推荐;ZGC/Shenandoah为现代低延迟方案(未详述,需额外配置)。 SerialGC 适用场景:小型应用、单CPU桌面环境(如开发测试)。 机制: 单线程,新生代(复制算 1 0 0
03-21 JVM 技术博客 Java (2)《虚拟机栈》 一、核心原理与结构 栈内存模型 每个线程私有,生命周期与线程绑定(线程启动创建,线程终止销毁) 栈结构:先进后出(LIFO)的栈帧集合 栈帧组成: 局部变量表(存储基本类型+对象引用) 操作数栈(执行引擎计算用) 动态连接(方法符号引用) 方法返回地址(正常返回/异常返回) 栈帧生命周期 方法调用 5 0 0
03-21 JVM 技术博客 Java (4)《方法区》 一、核心原理与结构 逻辑定义 线程共享区域,存储已加载类的元数据 JVM规范定义的抽象概念,具体实现由JVM厂商决定 核心组成: 类元数据(Class metadata) 类名、父类/接口、方法/字段信息 访问标志、运行时常量池 静态变量(Static variables) 类级别共享数据 JIT编 2 0 0
03-21 JVM 技术博客 Java (3)《堆内存》 一、核心原理与结构 内存模型定义 线程共享区域,所有对象实例和数组存储在此 JVM启动时通过-Xms和-Xmx参数设置初始/最大堆大小 典型结构划分(以G1收集器为例): 年轻代(Young Generation)≈1/3堆内存 Eden区(默认8:1:1) From Survivor To Sur 1 0 0
03-21 JVM 技术博客 Java (5)《方法执行流程》 核心机制:JVM通过执行引擎逐条解释字节码指令,依托栈帧(Stack Frame)管理方法执行上下文。 1. 类加载与初始化 类加载器:将字节码文件加载至JVM,常量池内容(如字面量、符号引用)复制到运行时常量池(Runtime Constant Pool)。 大字面量处理:若常量值 > short 1 0 0
03-21 JVM 技术博客 Java (6)《常量池深度解析》 一、常量池分类 类型 存储位置 触发时机 内容 生命周期 线程共享 字节码常量池 .class 文件 编译期 类名、方法名、字符串字面量等 持久化磁盘 否 运行时常量池 方法区(Metaspace) 类加载时 符号引用 → 直接引用 JVM 运行期间 是 字符串常量池 堆(JDK 7+) 首次使用字 2 0 0
03-21 JVM 技术博客 Java (8)《垃圾回收》 核心定位 主要 & 最频繁 GC:集中于堆内存。 对象回收判断机制 引用计数法 逻辑:引用存在则+1,消失则-1;计数为0则回收。 缺陷:循环引用(如A→B, B→A)导致计数永不归零 → 内存泄漏(分配内存后无法回收,持续增长)。 Java未采用此法。 可达性分析(主流) GC Root(不可回收 2 0 0