Spring AOP代理类是否会被垃圾回收器回收?多请求内存占用问题咨询
Spring AOP代理的内存占用与生命周期问题
核心结论
Spring AOP不会因为大量请求产生代理相关的内存浪费问题,代理类/实例的生命周期与目标Bean强绑定,并非随请求频繁创建销毁。
详细解析
代理的创建时机与复用逻辑
Spring AOP的代理(JDK动态代理或CGLIB代理)是在Bean初始化阶段生成的:每个被切入的目标类只会生成一份代理类定义,对应的代理实例默认和目标Bean一样是单例。也就是说,25个目标类对应25个代理类、25个单例代理实例——不管多少请求过来,都是复用这些已存在的代理实例,不会为每个请求新建代理。内存开销的可控性
代理类的字节码本身占用内存极小,单例代理实例的内存占用和目标Bean相当,25个代理实例的总内存开销完全在合理范围内,不会造成所谓的"内存浪费"。代理的生命周期与GC规则
- 若目标Bean是单例(绝大多数业务场景),代理实例会和目标Bean一起持续驻留内存,直到Spring容器关闭,不会被GC回收;
- 若目标Bean是原型/请求作用域,对应的代理实例会随目标Bean一起,在不再被引用(比如请求结束后)时被GC回收。但这类场景属于业务需求特殊配置,Spring也会做相应的内存优化。
特殊场景补充
如果使用@ScopedProxy实现跨作用域代理(比如单例Bean依赖请求作用域Bean),Spring会生成一个代理类来延迟获取目标Bean实例,这类代理本身还是单例,不会随请求创建新代理,内存占用依然可控。
内容的提问来源于stack exchange,提问作者scarletspeedster
相关产品推荐
相关产品推荐

