高性能代码应让对象生命周期契合GC机制:优先短命局部对象、及时置空引用、慎用static和ThreadLocal、善用弱引用、避免高频创建包装类与字符串拼接、预估集合容量、复用缓冲区、适配分代回收结构。

编写高性能代码配合垃圾回收,核心不是“对抗GC”,而是让对象生命周期与JVM或Python的回收机制自然契合——减少干扰、降低压力、避免意外阻塞。
控制对象生命周期,让GC少干活
对象越短命、越局部,GC负担就越轻。优先让对象在方法内创建、使用、消亡,不逃逸出作用域。
- 避免无意义的长引用:比如把临时计算结果存进全局缓存,却不设淘汰策略
- 及时置空强引用:尤其在循环或长生命周期对象(如Servlet、Handler)中,用完就设为
null - 慎用
static持有大对象或集合,容易导致老年代堆积
善用引用类型,交由GC自主决策
Java和Python都提供不同强度的引用,合理选用能让GC更高效地识别可回收对象。
- 缓存场景优先用
WeakReference或SoftReference(Java),或weakref.WeakKeyDictionary(Python) - 避免
ThreadLocal长期持有对象,未清理易引发内存泄漏(实测占堆23%+) - Python中慎用
__del__和weakref.ref()混用,可能造成循环依赖卡住回收
减少GC干扰的操作习惯
有些写法看似简洁,实则悄悄放大GC压力。
- 字符串拼接不用
+(尤其循环中),改用StringBuilder(Java)或str.join()(Python) - 集合初始化预估容量:
new ArrayList(100)比默认扩容更省内存和复制开销 - 复用缓冲区:如
ByteBuffer、bytearray,避免每次分配新数组 - 避免在高频路径创建包装类(如
Integer.valueOf()在-128~127外会新建对象)
适配分代回收的代码结构
JVM新生代采用复制算法,Python分代GC按代龄触发——代码结构可以顺势而为。
- 把短期中间数据(如DTO、临时列表)保持在方法栈内,不提升为字段
- 批量处理时,拆成小批次+显式
gc.collect(0)(Python)或手动触发Minor GC(Java需谨慎) - Java中开启逃逸分析(默认开启),让JVM自动将未逃逸对象栈分配,绕过堆和GC



















