-
我的一个高频接口性能差、GC 压力大,代码里却看不出哪行慢,profiler 一看全是堆分配,原来是我把一堆 int、bool 当 object 存进了集合、每次存取都在悄悄装箱拆箱的深度复盘
我有个高频调用的接口性能不理想、GC 频繁、内存分配率高,盯着代码看了半天每一行都很正常,实在找不出问题。直到用 profiler 抓内存分配才傻眼:大量堆分配集中在一段看起来人畜无害的代码上——我用了 Dictionary 存各种属性(里面塞了一堆 int、bool、DateTime 这些值类型)高频存取。复盘才搞懂:C# 里值类型默认在栈上或内联、不在堆上单独分配,但把它赋给 object(或…- 2
- 0
-
一行 int count = map.get(key) 的赋值,在 key 不存在时悄悄触发了自动拆箱、抛出莫名其妙的空指针:一次 Java 自动装箱拆箱的深度复盘
一行 int count = countMap.get(userId) 偶尔抛 NullPointerException,可这行没有任何显式的 . 方法调用,哪来的空指针?根因是 Map.get 返回 Integer、key 不存在时返回 null,而赋给 int 会触发自动拆箱(实为调 .intValue()),对 null 调 .intValue() 就 NPE——这个 .intValue()…- 0
- 0
-
我把结构体放进 List 里改它的字段,改了半天发现原数据纹丝不动,我盯着这个见了鬼的结果排查了大半天才搞懂值类型复制语义的深度复盘
我定义了个 struct(如 Point),放进 List 后想遍历改它的字段,结果改完原数据纹丝不动、修改压根没生效。我明明 var p = list[0]; p.X = 99 改了、p 也确实变了,可 list[0] 就是不变。深究才懂:struct 是值类型,赋值/传参传的是"拷贝"而非引用——var p = list[0] 拿到的是副本,改 p 改的是副本,list 里…- 0
- 0
-
err 是 nil 却不等于 nil:Go 接口 nil 避坑复盘
这是一个让我对着 if err != nil 这行 Go 程序员每天写八百遍的代码彻底懵掉的 bug。现象是我们一个接口明明一切正常没有任何错误,可它总是走进错误处理的分支对用户返回系统异常。我盯着那个判断条件看了半天:函数我也看了正常情况下它返回的就是 nil 啊,既然返回了 nil 那 err != nil 不就该是 false 就不该进错误分支吗?可它偏偏进了,我甚至开始怀疑是不是 Go 的…- 0
- 0
-
一行算术抛空指针:Java 自动拆箱避坑复盘
这个 bug 让我对着一行算术代码瞪了整整半个小时,怎么也想不通它为什么会抛空指针:我们一个统计接口偶发性地报 NullPointerException,而异常堆栈指向的是 int total = stat.getCount() * 2 这么一行平平无奇的代码。我的第一反应是这怎么可能空指针,stat 我前面明明判过非空了,getCount 就是个普通取值方法,后面是个乘以2的算术运算,一行纯粹的…- 0
- 0
装箱
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!





