知识卡片
用共享池解决大量相似对象导致的内存溢出
内容
报考系统高并发下频繁OutOfMemory,非内存泄漏,而是每次请求都new全新SignInfo对象, 但”考试科目”仅4种取值、”地点”仅30多种,绝大多数字段重复。解法:建共享对象池,用 “科目+地点”作key,首次遇到新组合才创建对象,之后复用。整改后对象数从几万降到最多 120个。发散:遇到对象数量高并发暴涨,先查字段取值是否很小、高度重复,重复度越高, 共享池收窄空间越大。
参考来源
- 位置:《设计模式之禅(第2版)》第28章《享元模式》(源文件:_epub-src/text/part0126.html)
- 结论依据:原文详述报考系统OutOfMemory问题排查过程,发现SignInfo对象占用400多MB内存,考试科目只有4个、地点只有30多个,通过按"科目+地点"作为key建立共享池,把对象数量从几万个降到最多120个。
- 原始内容:几十万SignInfo对象中,考试科目就4个,考试地点也就是30多个……我们把对象的相同属性提取出来,不同的属性在系统内进行赋值处理,是不是就可以建立一个池了?……最多120个对象,相比之前几万个SignInfo对象优化了非常多。