系统介绍:

之前线上跑着一个索引系统,该索引系统主要功能将数据库的数据取出来构建成一个大的反向索引对象,存储在本地cache中,然后供业务方进行查询使用。该系统主要分为两大模块,一个为controller,一个为server。controller主要负责数据的更新操作,当数据更新后,广播消息通知server并发送一个版本号newVersion(假设为newVersion=10)。server收到消息后,会获取Redis的当前索引对应的版本号curVersion,如果newVersion>curVersion,那么则说明需要重建索引,就会先加锁(避免多台同时构建),然后加载数据并构建索引,再将索引对象以及最新的版本号存储到redis,更新本地cache中的索引对象,最后释放锁,如果加锁失败(说明有其他的机器在构建索引了),则等待一段时间之后再重新获取curVersion并newVersion比较。当newVersion<=curVersion,则直接从缓存中加载索引,更新到本地cache中

问题:

某天忽然有一台server服务器出现了OOM异常,感觉很奇怪,通过使用jmap导出了堆信息,并通过MAT分析发现,索引上有两个对象引用的大小是一样的,查看代码发现,原来在构建索引对象时,为了使用方便,将一个对象赋值给了两个引用,这种方式,在内存中是占用一份数据的大小,不会有问题。然后序列化之后,再反序列化回来,就不是同一个对象了,在内存中就会占用两份数据,这样就会导致数据大小扩大了许多

改进:

找到了问题,就很好处理了,将重复的那个引用去掉,内存占用立马少了600多M

继续改进:

由于索引数据中的很多字符串相同的,都是城市名字,但是对象从redis中取出来是通过反序列化实现的,无法使用inter()的方法来减少内存的占用。后来在网上查到如果是G1垃圾收集器的话,可以使用-XX:+UseStringDeduplication来进行字符串排重,以下是排重后的效果图,大概可以看出char数组由原来的429M减少到了82M多,注意UseStringDeduplication只会减少char数组的量

关于-XX:+UseStringDeduplication

在应用程序启动期间传递此JVM参数时,JVM将尝试在垃圾收集过程中消除重复的字符串。在垃圾收集过程中,JVM会检查内存中的所有对象,因此作为该过程的一部分,它会尝试识别它们中的重复字符串并尝试消除它。

'-XX:+ UseStringDeduplication'消除了较长时间内存在的重复字符串,对JavaWeb应用程序进行的真实案例研究,当使用'-XX:+ UseStringDeduplication'时,该应用程序没有显示任何内存缓解。但是,如果您的应用程序有很多缓存,那么'-XX:+ UseStringDeduplication'可能是有价值的(因为缓存对象通常往往是长期存在的对象)

'-XX:+ UseStringDeduplication'不会消除重复的字符串对象本身。它只替换了底层的char []。对String对象进行重复数据删除在概念上只是对value字段的重新赋值,即aString.value = anotherString.value。

注意:改参数只支持JDK8U20之后,垃圾收集是G1

转载于:https://www.cnblogs.com/hello---word/p/11067148.html

记录一次缓存系统的优化过程相关推荐

  1. 记录一次wordpress网站速度优化过程,看我如何有效提升wordpress加载打开速度

    如何提升wordpress站点速度 简介 分析 具体优化步骤 总结 简介 共读书房是国内非常有影响力的一家线下阅读品牌,共读书房官方网站采用了wordpress进行了二次开发,有兴趣的同学可以点击测试 ...

  2. 工作记录二: 记录一次简单的SQL优化过程

    在工作时, 和同事一起遇到了一个关于SQL优化方面的问题, 现在将解决过程记录如下 项目缺陷描述 项目分析思路 首先F12进入开发者模式, 查看最费时的请求 然后利用restful风格接口工具集( R ...

  3. 订单失效怎么做的_此招一出,数据库压力降低90%,携程机票订单缓存系统实践...

    本文转自 | 携程技术 作者简介 Chaplin,携程资深PMO,平时喜欢解决系统相关的问题,包括但不限于分布式/大数据量/性能/体验等,不畏复杂但更喜欢简单.本文旨在分享携程机票后服务订单处理团队, ...

  4. 订单失效怎么做的_数据库压力降低90%,携程机票订单缓存系统实践

    本文旨在分享携程机票后服务订单处理团队,在构建机票订单缓存系统过程中的一些思考总结,希望能给大家一些启发或帮助.通篇分为以下七大部分:背景,瓶颈,选型,架构,方案,优化,总结,文章概要如下图: 一.背 ...

  5. 订单失效怎么做的_携程技术专家:数据库压力降低90%,订单缓存系统架构实践...

    来源:携程技术(ID:ctriptech) 本文旨在分享携程机票后服务订单处理团队,在构建机票订单缓存系统过程中的一些思考总结,希望能给大家一些启发或帮助.通篇分为以下七大部分:背景,瓶颈,选型,架构 ...

  6. 缓存系统MemCached的Java客户端优化历程

    來源:http://www.infoq.com/cn/articles/memcached-java 作者 岑文初 发布于 2008年9月27日 上午12时38分 社区 Java 主题 集群与缓存 M ...

  7. JVM优化过程全记录

    今天看JVM群里有人发了一个GC情况,让人帮忙看优化的,于是我也凑热闹发了出来想让群里的大神们指导优化一下,以下是优化过程记录. 一开始我贴了下面的两张图 jstat看GC记录 jstat -gcut ...

  8. springBoot餐厅店内点餐系统点餐外卖配送餐馆饭店收银系统实现记录一下「源码文档实过程]

    系统架构 SpringBoot\SSM(两个版本) JSP.JSTL.jQuery.HTML.CSS.JS Mysql bootstrap 开发工具和环境 Eclipse\idea(都可以)兼容 Ma ...

  9. 记一次mysql性能优化过程

    2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...

最新文章

  1. linux系统操作常见问题(ubuntu和opensuse)
  2. 2.7 RMSprop-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  3. 阿里云基于NVM的持久化高性能Redis数据库
  4. Array.prototype.slice.call()方法详解
  5. json:JSONObject包的具体使用(JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包)...
  6. 如何预估服务器带宽需求【转】
  7. 安装logstash7.3.2遇到的坑及解决方案
  8. 大数据时代的可扩展性数据库集群技术
  9. SQL,修改表列明错误,不允许保存更改,阻止保存要求重新创建表的更改
  10. 欧姆龙rxd指令讲解_欧姆龙plc的指令-机电之家网PLC技术网
  11. Word制作音乐简谱(转)
  12. bat脚本实现一键IP切换
  13. 东芝2303am维护清零_东芝打印机2303A怎样清零?
  14. 双稳态一键开关机电路
  15. mysql 命令执行drop 命令_drop table是什么命令?
  16. inputBox 与 Application.inputBox 的用法与区别。
  17. 如何编写android ANE
  18. 水箱建模最小二乘法_高位消防水箱考点汇总及历年真题!
  19. 最先进的智能采茶机器人_采茶机器人、挑茶机器人、智能立体仓储系统等这些在常人眼中颇具科幻气息的设备-新闻头条5dainban...
  20. 分析在线直播答题应用基础架构

热门文章

  1. 专门针对科学家工程师的僵尸网络
  2. [PLAYING QTP] Part2—Record
  3. composer 报 zlib_decode(): data error
  4. 如何禁用Visual Studio 2013的Browser Link功能
  5. 数学图形(2.10)一种绕在球上的线圈
  6. Yii 1.1.4发布,高性能的PHP框架
  7. 基于移动设备的Wifi开发组件
  8. android 悬浮按钮 魅族,魅族,我的悬浮球功能比你的强大:悬浮菜单
  9. 数据结构(C语言实现)第1章课后习题参考答案
  10. sql语句相似度统计的说明