我正在研究我最近的一个项目中的内存问题,该项目将数据保留在内存中以进行快速访问,但是应用程序的内存占用量非常大。

该应用程序大量使用CHM(即Concurrenthashmap) ,因此,无需再费脑筋地猜测CHM是问题所在。 我进行了一个内存分析会话,以了解CHM实际占用了多少内存。

我对结果感到惊讶,CHM占用了大约50%的内存。 因此,可以确定CHM是问题所在,它速度很快,但内存效率不高。

为什么CHM这么胖?

  • 键/值由Map.Entry对象包装,这为每个对象创建了一个额外的对象。
  • 每个段都是一个可重入锁,因此,如果您有很多小的CHM且默认为并发级别,则将有很多锁对象,并且该对象将排在首位。
  • 还有更多的州开展家政活动。

上述所有对象都对内存消耗做出了很好的贡献。

我们如何减少内存占用

如果很难减少CHM的内存占用量,我想到的一些可能原因是

  • 它必须支持Map的旧界面
  • Java映射使用的哈希码冲突技术是封闭哈希 。 封闭式散列基于在冲突时创建链接列表,封闭式散列对于解决问题非常快,但它对CPU缓存不友好,尤其是当节点进入较大的链接列表时。 关于LinkList问题有一篇有趣的文章

因此,我们需要一种内存效率高的替代CHM实现。

CHM版本2

我开始创建具有低内存占用量的CHM版本,目标是尽可能接近数组。 我还使用了替代的哈希码冲突技术来检查性能, Open_addressing有很多选项

我尝试了以下选项:

  • 线性探测 –性能并不是那么好,尽管这是最友好的CPU缓存。 需要花费更多的时间来解决问题。
  • Double_hashing –性能在可接受的范围内。

让我们测量CHM V2

  • 内存占用

在内存方面有很大的收获,CHM比原始数据多花了大约45%+,新实现的LCHM非常类似于Array类型。

  • 单线程PUT性能

CHM在PUT测试中的表现胜过新产品,对于100万个项目,新实施的速度要慢50到80毫秒。 50到80 ms并不是明显的延迟,我认为这对延迟要求以秒为单位的应用程序来说是很好的。 如果延迟要求以毫秒/纳秒为单位,则CHM的任何方式都不是一个好的选择。 LCHM性能较慢的原因是哈希冲突技术,双哈希用于解决有代码冲突的问题。

  • 并发添加性能

当使用多个线程来写入映射时,新实现的性能稍好。

  • 取得成效

与CHM相比,GET的性能略慢。

结论

新的实现在内存测试中表现出色,并且在获取/输出测试中有点慢。 有几件事情可以做,以提高获取/输出的性能,我们看到的所有性能差异都归因于所使用的探测技术。

  • 可以改进探测技术,可以使用线性探测技术来获取缓存友好的访问。
  • 使探测技术并行化非常容易。
参考:在Are Are ready博客上试验我们JCG合作伙伴 Ashkrit Sharma的ConcurrentHashmap 。

翻译自: https://www.javacodegeeks.com/2013/05/experiment-with-concurrenthashmap.html

试验ConcurrentHashmap相关推荐

  1. java温故笔记(二)java的数组HashMap、ConcurrentHashMap、ArrayList、LinkedList

    为什么80%的码农都做不了架构师?>>>    HashMap 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.随着JDK(Java Develo ...

  2. (各种均衡算法在MIMO中的应用对比试验)最小均方误差(MMSE)原理推导以及在MIMO系统中对性能的改善。

    文档和程序地址:下载地址 各种均衡算法在MIMO中的应用对比试验,内附原理推导,对比实验说明和结果等.包括MMSE,ZF,ZF-SIC等.代码附有原理推导小论文.仅供参考

  3. 调试JDK源码-ConcurrentHashMap实现原理

    调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...

  4. git 裁切_裁切参数设计(DOE试验)

    裁切不良改善方案 ( GITO3675DOE 试验) 一.背景 我司现有很多参数都是根据经验按生产效果所制定. 对于现有参数是否最佳 无从判定,因此希望导入 DOE 试验设计对各种参数进行设定. 二. ...

  5. 实战:一次失败的WEB攻击试验,欢迎高手补充

    2019独角兽企业重金招聘Python工程师标准>>> 首先声明:这个文章我描述的是一次比较失败的WEB攻击试验,理论基础是一次在网上看到的一篇关于"慢攻击"的概 ...

  6. 面试之Hashtable和ConcurrentHashMap

    那么要如何保证HashMap的线程安全呢? 方法有很多,比如使用Hashtable或者Collections.synchronizedMap,但是这两位选手都有一个共同的问题:性能.因为不管是读还是写 ...

  7. 深入研究ConcurrentHashMap 源码从7到8的变迁

    ConcurrentHashMap是线程安全且高效的HashMap 1 为什么要使用ConcurrentHashMap 线程不安全的HashMap HashMap是Java中最常用的一个Map类,性能 ...

  8. 【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别

    转自:http://blog.csdn.net/paincupid/article/details/47746341 一.HashMap和TreeMap区别 1.HashMap是基于散列表实现的,时间 ...

  9. Hashtable,HashMap,ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的

    多选 Hashtable,HashMap,ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的:答案在文末 A. Hashtable的K ...

最新文章

  1. 北上广Java开发月薪20K往上,该如何做,需要会写什么
  2. codeforces 271A-C语言解题报告
  3. 二叉树的层序遍历和前中后序遍历代码 迭代/递归
  4. 史上最牛研究生已成院士,给出“维持科研创新能力”的秘诀
  5. Python问题记录:如何处理中文网页中的多余空格
  6. 多线程处理list_跟大佬聊天,被反问Redis6的多线程真的能提高性能吗?
  7. java中的math pow_Java ME中的Math.pow()方法使用详解
  8. maya 中的 cmds.scriptJob 命令
  9. web爬虫讲解—urllib库中使用xpath表达式—BeautifulSoup基础
  10. 基于Redis的限流器的实现
  11. PHP小马免杀的浅谈[过最新D盾]
  12. 输出文本(pre\code\kbd\var...)
  13. 通用嵌入式系统测试平台 ETest简介
  14. Anaconda详细安装使用教程
  15. php百度登录完整代码_百度熊掌号专业问答PHP方式推送完整代码(附说明)
  16. HP服务器数据恢复通用办法【案例】
  17. 合规羊毛党小贴士,谈谈award caculator
  18. Docker百度云下载链接
  19. 语音处理/语音识别基础(四)- 语音文件读取与播放
  20. 安装nodejs报错2503

热门文章

  1. java阻塞队列小结
  2. (转)Kafka 消费者 Java 实现
  3. 利用 GregorianCalendar 制作当前月的月历
  4. aws上负载均衡器标组端口_AWS CloudFormation:目标组没有关联的负载均衡器
  5. 世界是沙粒还是宇宙_看到一个沙粒世界:再一次你好世界
  6. hystrix应用 博客_使用Hystrix DSL创建弹性骆驼应用程序
  7. couchbase_具有Rx-Java的Couchbase Java SDK
  8. gradle排除依赖_如何从Gradle中的所有依赖项中排除库
  9. 尺度不变性是指什么不变_不变性如何提供帮助
  10. 如何构建一个Maven插件