应优先使用基本类型替代包装类以减少gc压力,需识别隐式装箱场景(如赋值给object、非泛型集合操作、重载方法调用),全程使用栈上基本类型变量,配合泛型集合与轻量结构体,并避免显式拆箱及中间object中转。

直接用基本类型替代包装类,能避免堆上创建临时对象,从而减少GC压力。关键在于识别哪些地方发生了隐式装箱,并用栈上变量承接计算过程。
识别高频装箱场景
以下代码会频繁触发装箱,成为GC诱因:
- 将int、bool、double等值类型赋给object或接口类型(如
object o = i;) - 向非泛型集合(
ArrayList、HashTable)添加值类型 - 调用接受
object参数的重载方法(如Console.WriteLine(i)虽有优化,但自定义方法无保障) - 在
foreach遍历非泛型集合时,迭代变量声明为object
用基本类型局部变量承接中间结果
不把值类型“推”到引用语义环境里,而是全程保留在栈上:
- 方法内部计算时,用
int sum = 0;而非Integer sum = 0;(Java)或int? sum = null;(C#) - 循环中累积、比较、条件判断,全部使用
int/long/double等原始类型变量 - 需要暂存多个状态时,拆成多个基本类型字段,而不是打包进一个
new ValueWrapper(i, j, flag)
配合泛型与结构体规避包装
仅替换局部变量还不够,需切断装箱源头:
- C#中用
List<int></int>代替ArrayList,用Dictionary<string double></string>代替HashTable - Java中用
IntStream代替stream().mapToInt(...)链中混用Integer - 必要时定义轻量
struct(C#)或record class(Java 14+),但确保不带引用字段,避免间接引入GC对象
注意拆箱陷阱
即使用了基本类型变量,若从已装箱对象还原,仍会产生开销:
- 避免
int x = (int)boxedValue;这类显式拆箱,尤其在循环内 - 不依赖
Convert.ToInt32(obj)或Int32.Parse(str)处理大量数据——它们内部可能新建临时对象 - 从数据库或JSON解析拿到的数值,优先走强类型反序列化路径(如
JsonSerializer.Deserialize<int>()</int>),跳过object中转











