JVM IOC Bean 完整总结一、JVMJDK8重点内存区域元空间 Metaspace存类的字节码、Class 元信息、常量池。类加载成功后Class 信息放这里一个类加载器下同一个 Class 只会加载一次。类加载触发时机实例化 Bean 那一刻才加载 Class扫描阶段不加载 Class。堆 Heap所有 Java 对象实例存放的地方。BeanDefinition 对象、Bean 实例 (target 原始对象 /proxy 代理对象)、BeanDefinitionMap、singletonObjectsConcurrentHashMap全部在堆。Map 里只存对象引用内存地址不是对象实体。虚拟机栈每个线程私有。方法内局部变量基本类型、对象引用地址放在栈帧方法执行完毕栈帧出栈销毁。程序计数器线程私有记录当前线程执行到哪一行字节码。本地方法栈给 native 本地方法使用。直接内存堆外内存不归 GC 管理。GC 规则堆里的对象没有强引用时会被 GC元空间的 Class 很难被回收。二、IOC 容器Spring 核心思想控制反转IOC 是思想BeanFactory/ApplicationContext是 IOC 容器的实现容器本身也是堆上的 Java 对象。 容器内部两个核心 MapBeanDefinitionMap元数据核心keybean 名称valueBeanDefinition对象堆中的模板对象启动包扫描阶段生成保存所有 Bean 的描述模板类名、作用域 scope、是否懒加载等。作用告诉 Spring如何创建 Bean。singletonObjects 单例池本质ConcurrentHashMap堆内存。keybean 名称value已经实例化完成的单例 Bean 的对象引用。作用缓存建好的单例 Bean后续 getBean 直接复用避免重复创建。prototype 多例 Bean不会放入单例池。IOC 容器的核心动作依赖注入 DI容器自动给 Bean 的成员变量赋值不用手动 new 对象。三、Bean 以及 3 种常见作用域基础概念BeanDefinition模板对象堆不是业务 Bean 实例描述 Bean 信息。target原始业务对象堆没有 AOP 增强。proxyAOP 动态生成的代理对象堆。需要 AOP 增强时放入单例池的是 proxy 的引用proxy 内部持有 target 的引用target 不进单例池。成员变量属于 Bean 对象的字段存在堆上的 Bean 实例中。作用域singleton 默认单例非懒加载容器启动扫描生成 BeanDefinition 存入 BeanDefinitionMap立刻实例化 Bean。实例化触发类加载Class 放入元空间实例创建完成放入 singletonObjects。单例池持有强引用容器不关闭不会 GC容器关闭才释放引用。经典坑单例 Bean 注入 prototype 多例 Bean依赖注入只在单例实例化的时候执行一次后续调用方法复用同一个 prototype 对象不会自动新建。singleton Lazy 懒加载单例容器启动只生成 BeanDefinition不实例化、不加载 Class。第一次 getBean使用时才实例化 Bean触发类加载创建对象放入单例池后续复用。prototype 多例 Scope (“prototype”)容器启动只生成一份 BeanDefinition 模板存入 BeanDefinitionMap。每次调用 getBean拿同一份模板新建全新 Bean 实例不存入单例池。Spring 创建完 prototype 实例后不再持有引用没有引用时对象会被 GC。Spring不会执行 prototype 的 PreDestroy 销毁回调。getBean 通用流程优先去 singletonObjects 单例池查找找到直接返回 Bean 引用单例池没有 → 去 BeanDefinitionMap 取出对应的 BeanDefinition 模板根据模板的类名触发类加载Class 信息载入元空间反射实例化 Bean 对象执行依赖注入判断是否需要 AOP 增强需要则生成 proxy 代理对象如果是 singleton放入 singletonObjectsprototype 不放入返回对象引用。四、整合笔记完整版可直接复制背诵【JVM】 元空间存类字节码Class信息堆存放所有对象实例虚拟机栈存放方法局部变量方法结束销毁。 类加载时机实例化Bean那一刻才加载Class扫描BeanDefinition阶段不会加载Class同一个Class只会加载一次。 【IOC容器】 IOC是控制反转思想BeanFactory/ApplicationContext是IOC容器实现堆上对象。 BeanDefinitionMap是IOC元数据核心存放所有Bean的BeanDefinition模板对象 singletonObjects单例池本质是堆中的ConcurrentHashMap存放实例化完成的单例Bean引用。 Map中存储的是对象引用地址不是对象实体。 依赖注入DI容器自动给Bean的成员变量赋值成员变量保存在堆上的Bean实例中。 【Bean AOP】 BeanDefinition是元信息模板对象堆不是业务Bean实例。 target原始业务对象proxyAOP代理对象AOP场景下单例池存放proxy引用proxy内部持有targettarget不进单例池。 Bean作用域 1.singleton(默认)启动就实例化放入单例池容器存活期间强引用不会GC。 2.singletonLazy启动只存BeanDefinition第一次getBean才实例化、加载Class。 3.prototype多例BeanDefinition全局只有一份每次getBean新建堆对象不进单例池Spring不管理销毁。 重要坑点单例Bean注入prototype仅在单例实例化阶段注入一次后续调用复用同一个prototype对象不会自动新建。 getBean流程优先从单例池查找没有则读取BeanDefinition模板触发类加载、实例化、DI、AOP代理创建singleton存入单例池prototype不存入。