天池,基于阿里云的开放数据处理服务ODPS,面向学术界开放海量数据和分布式计算资源,旨在打造“数据众智、众创”第一平台。在这里,人人都可以玩转大数据,共同探索数据众创新模式。
目录
相关文章推荐
今天看啥  ›  专栏  ›  天池大数据科研平台

一行代码,我优化掉了1G内存占用

天池大数据科研平台  · 公众号  · 大数据  · 2024-12-25 11:25
    

主要观点总结

文章主要描述了一个项目中的内存问题,通过优化字符串常量池的使用解决了该问题。

关键观点总结

关键观点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 的方式重复加载到了堆空间内。 突然想到了常量池这个概念,打算把它用起来,这样在不改变 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览