主要观点总结
文章主要描述了一个项目中的内存问题,通过优化字符串常量池的使用解决了该问题。
关键观点总结
关键观点1: 问题描述
项目中采用全内存缓存机制,因配置数据量膨胀导致内存占用上涨,出现FullGC问题。
关键观点2: 解决方案
通过引入字符串常量池的概念,使用String.intern()方法来解决内存占用问题。具体实现包括自定义反序列化器以及重写HashMap的put方法。
关键观点3: 实施细节
首先明确项目中使用的fastjson序列化工具不会处理特定value的常量池。然后自定义反序列化器来调用intern方法,并找到适当的切点进行干预。最后通过重写HashMap的put方法来处理Map类型的成员value。
关键观点4: 优化效果
通过优化,成功降低了内存占用,从最初的1.6G+干到了619M。
关键观点5: 总结与展望
问题的本质在于低信息熵没有被很好地压缩。未来会从数据结构的设计上重新思考并解决这个问题。本次优化对实战和源码阅读都有收获。
文章预览
阿里妹导读 这里一行代码,指的是:String.intern()的调用,为了调用这一行代码,也写了几十行额外的代码。 背景 我们有一个项目,采用了全内存缓存机制。一方面是为了追求卓越的RT,另一方面是数据量确实很小,标准的4C8G容器处理起来绰绰有余。可是突然有一天,预发环境,疯狂报警FullGC,定位了一下原因,原来是这个缓存变得太大了。 正文 我们通常会把数据量级在百条左右的配置项加载到内存里,近期一个新需求,导致配置数据量膨胀到了十万级,一口气加载到了内存里,自然造成了内存占用的上涨。但是,经过分析,这些数据的信息熵并不是很高。大面积的json其实是在存储有限种排列组合的字符串,但是这些字符串被反序列化框架以 new String 的方式重复加载到了堆空间内。 突然想到了常量池这个概念,打算把它用起来,这样在不改变
………………………………