Java:ChronicleMap第1部分,精简版

用数百万个对象填充HashMap会很快导致诸如内存使用效率低下,性能低下和垃圾回收等问题。 了解如何使用堆外CronicleMap ,其中可以包含数十亿个对象,而对堆的影响很小或没有。

当我们要使用中小型数据集时,内置的Map实现(例如HashMapConcurrentHashMap是出色的工具。 但是,随着数据量的增长,这些
Map的实现正在恶化,并开始表现出如约开放sourceed的系列文章的第一篇文章中一些令人不快的缺点CronicleMap

堆分配

在下面的示例中,我们将使用Point对象。 Point是一个POJO,具有公共默认构造函数以及X和Y属性(int)的getter和setter。 以下代码段将一百万个Point对象添加到HashMap

 final Map<Long, Point> m = LongStream.range( 0 , 1_000_000) .boxed() .collect( toMap( Function.identity(), FillMaps::pointFrom, (u,v) -> { throw new IllegalStateException(); }, IllegalStateException(); }, HashMap:: new ) ); // Conveniency method that creates a Point from // a long by applying modulo prime number operations private static Point pointFrom( long seed) { final Point point = new Point(); point.setX(( int ) seed % 4517 ); point.setY(( int ) seed % 5011 ); return point; } 

我们可以很容易地看到堆上分配的对象数量以及这些对象消耗多少堆内存:

 Pers-MacBook-Pro:chronicle-test pemi$ jmap -histo 34366 | head | head num    #instances        #bytes class name (module)  ------------------------------------------------------- 1 : 1002429 32077728 java.util.HashMap$Node (java.base @10 ) 2 : 1000128 24003072 java.lang.Long (java.base @10 ) 3 : 1000000 24000000 com.speedment.chronicle.test.map.Point 4 : 454 8434256 [Ljava.util.HashMap$Node; (java.base [Ljava.util.HashMap$Node; (java.base @10 ) 5 : 3427 870104 [B (java.base @10 ) 6 : 185 746312 [I (java.base @10 ) 7 : 839 102696 java.lang.Class (java.base @10 ) 8 : 1164 89088 [Ljava.lang.Object; (java.base [Ljava.lang.Object; (java.base @10 ) 

对于每个Map条目,都需要在堆上创建LongHashMap$NodePoint对象。 还有许多创建了HashMap$Node对象的数组。 这些对象和数组总共消耗了88,515,056字节的堆内存。 因此,每个条目平均消耗88.5个字节。

注意:额外的2429 HashMap$Node对象来自Java内部使用的其他HashMap对象。

堆外分配

与此相反, CronicleMap使用很少的堆内存,运行以下代码时可以看到:

 final Map<Long, Point> m2 = LongStream.range( 0 , 1_000_000) .boxed() .collect( toMap( Function.identity(), FillMaps::pointFrom, (u,v) -> { throw new IllegalStateException(); }, IllegalStateException(); }, () -> ChronicleMap .of(Long. class , Point. class ) .averageValueSize( 8 ) .valueMarshaller(PointSerializer.getInstance()) .entries(1_000_000) .create() ) ); 
 Pers-MacBook-Pro:chronicle-test pemi$ jmap -histo 34413 | head | head num    #instances        #bytes class name (module)  ------------------------------------------------------- 1 : 6537 1017768 [B (java.base @10 ) 2 : 448 563936 [I (java.base @10 ) 3 : 1899 227480 java.lang.Class (java.base @10 ) 4 : 6294 151056 java.lang.String (java.base @10 ) 5 : 2456 145992 [Ljava.lang.Object; (java.base [Ljava.lang.Object; (java.base @10 ) 6 : 3351 107232 java.util.concurrent.ConcurrentHashMap$Node (java.base @10 ) 7 : 2537 81184 java.util.HashMap$Node (java.base @10 ) 8 : 512 49360 [Ljava.util.HashMap$Node; (java.base [Ljava.util.HashMap$Node; (java.base @10 ) 

可以看出,没有为Java分配对象
CronicleMap条目,因此也没有堆内存。

CronicleMap不会分配堆内存,而是分配堆外内存,而不是分配堆内存。 假设我们使用标志-XX:NativeMemoryTracking=summary启动JVM,则可以通过发出以下命令来检索正在使用的堆外内存量:

 Pers-MacBook-Pro:chronicle-test pemi$ jcmd 34413 VM.native_memory | grep Internal VM.native_memory | grep Internal  -                 Internal (reserved=30229KB, committed=30229KB) 

显然,我们的一百万个对象使用略多于30 MB的堆外RAM放置在堆外内存中。 这意味着,
CronicleMap使用的CronicleMap平均需要30个字节。

这比需要88.5字节的HashMap内存有效得多。 实际上,我们节省了66%的RAM内存和近100%的堆内存。 后者很重要,因为Java垃圾收集器只能看到堆上的对象。

注意,我们必须在创建时决定CronicleMap最多可以容纳多少个条目。 相比于
HashMap可以随着我们添加新的关联而动态增长。 我们还必须提供一个序列化程序 (即PointSerializer.getInstance() ),本文稍后将对此进行详细讨论。

垃圾收集

许多垃圾回收(GC)算法在与堆中存在的对象的平方成比例的时间内完成。 因此,例如,如果我们将堆上的对象数量加倍,则可以预期GC将花费四倍的时间才能完成。

另一方面,如果我们创建的对象增加了64倍,则预期的预期GC时间将增加1,024倍。 这有效地阻止了我们创造出巨大的
HashMap对象。

使用ChronicleMap我们可以放置新的关联,而无需担心垃圾收集时间。

序列化器

堆内存与堆外内存之间的介体通常称为
序列化器ChronicleMap带有许多针对大多数内置Java类型(例如IntegerLongString等)的预配置序列化器。

在上面的示例中,我们使用了一个自定义的序列化程序,该序列化程序用于在堆内存与堆外内存之间来回转换Point 。 序列化器类如下所示:

 public final class PointSerializer implements SizedReader<Point>, SizedWriter<Point> { private static PointSerializer INSTANCE = new PointSerializer(); public static PointSerializer getInstance() { return INSTANCE; } INSTANCE; } private PointSerializer() {} @Override public long size( @NotNull Point toWrite) { return Integer.BYTES * 2 ; } @Override public void write(Bytes out, long size, @NotNull Point point) { out.writeInt(point.getX()); out.writeInt(point.getY()); } @NotNull @Override public Point read(Bytes in, long size, Point using) { @Nullable Point using) { if (using == null ) { using = new Point(); } using.setX(in.readInt()); using.setY(in.readInt()); return using; }  } 

上面的序列化器实现为无状态单例,并且write()read()方法中的实际序列化非常简单。 唯一棘手的部分是,我们需要在
如果“ using”变量未引用实例化/重用的对象,则为read()方法。

如何安装?

当我们想在项目中使用ChronicleMap时,只需在pom.xml文件中添加以下Maven依赖项,就可以访问该库。

 < dependency > < groupId >net.openhft</ groupId > < artifactId >chronicle-map</ artifactId > < version >3.17.3</ version >  </ dependency > 

如果您使用的是另一种构建工具(例如Gradle),则可以通过单击此链接来了解如何依赖ChronicleMap

短篇小说

以下是ChronicleMap的一些属性:

堆外存储数据
几乎总是比HashMap更高的内存效率
实现ConcurrentMap 不影响垃圾收集时间 有时需要一个序列化器 具有固定的最大条目大小 可以容纳数十亿个协会 是免费和开源的

翻译自: https://www.javacodegeeks.com/2019/08/java-chroniclemap-part-1-go-off-heap.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渝粤教育] 兰州文理学院 信息技术基础 参考 资料

教育 -信息技术基础-章节资料考试资料-兰州文理学院【】 第1单元测验 - 信息技术与计算机 1、【单选题】计算思维是运用计算机科学的( )进行问题求解、系统设计、以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。 A、基础概念 B、思维方式 C、程序设计原理 D、操作系…

什么是光端机?

今天杭州飞畅科技的小编带大家来了解下什么是光端机&#xff0c;想要搞懂这个问题&#xff0c;首先咱们得从光端机的概念来讲起。 光端机的定义&#xff1a; 光端机是光通信系统中的传输设备&#xff0c;主要是进行光电转换及传输功用。一般用于电信、电力、监控、工业控制、视…

[渝粤教育] 内蒙古师范大学 数字逻辑电路 参考 资料

-数字逻辑电路-章节资料考试资料-内蒙古师范大学【】 数制 1、【填空题】<img src"http://edu-image.nosdn.127.net/CD49441B968A6557775A0711DD560A6C.jpg?imageView A、 参考资料【 】 2、【填空题】 A、 参考资料【 】 3、【填空题】 A、 参考资料【 】 码制 1、【…

[渝粤教育] 南宁职业技术学院 走进东盟 参考 资料

教育 -走进东盟-章节资料考试资料-南宁职业技术学院【】 走进东盟单元测验 1、【单选题】中国与东盟在陆地毗邻而居的国家中有哪些国家&#xff1f; A、越南、老挝、缅甸 B、越南、泰国、缅甸 C、A、 泰国、柬埔寨、缅甸 D、越南、新加坡、缅甸 参考资料【 】 2、【单选题】东盟…

什么是数字光端机?数字光端机使用注意事项详解!

数字光端机是一种通过数字电路控制光信号&#xff0c;使用类似于0、1代码来实现光通信的机器。广泛应用于光纤通信等领域。由于数字光端机具有传输信号质量高&#xff0c;没有模拟调频、调相、调幅光端机多路信号同传时交调干扰严重、容易受环境干扰影响、传输质量低劣、长期工…

[渝粤教育] 南昌大学 现场生命急救知识与技能 参考 资料

教育 -现场生命急救知识与技能-章节资料考试资料-南昌大学【】 随堂测试 1、【多选题】急救医疗服务体系由哪几部分构成&#xff1f; A、院前急救 B、院内急诊 C、急危重症监护 D、康复治疗 参考资料【 】 随堂测试 1、【多选题】现场急救的目的有哪些&#xff1f; A、维持生命…

jdk8 接口抽象类区别_JDK 8时代的抽象类与接口

jdk8 接口抽象类区别在新的Java 8日期和时间API&#xff1a;Stephen Colebourne的访谈中 &#xff0c; Stephen Colebourne告诉Hartmut Schlosser &#xff1a;“我认为最重要的语言更改不是lambda&#xff0c;而是接口上的静态和默认方法。” Colebourne补充说&#xff1a;“添…

[渝粤教育] 兴义民族师范学院 数据结构 参考 资料

形&#xff09;&#xff0c;另两个投影面积聚为&#xff08; &#xff09;。A、 直线B、 曲线C、 点D、 平面参考答案&#xff1a;A 教育 -数据结构-章节资料考试资料-兴义民族师范学院【】 小测验&#xff1a;算法复杂度 1、【单选题】下列函数中&#xff0c;哪个函数具有最快…

什么是高清DVI光端机?dvi光端机的技术参数及应用有哪些?

DVI光端机是由DVI发送器&#xff08;DVI-T&#xff09;和DVI接收器&#xff08;DVI-R&#xff09;组成&#xff0c;通过一芯单模光纤传输DVI、VGA、Audip、RS232信号。那么&#xff0c;什么是高清DVI光端机呢&#xff1f;DVI光端机的应用范围及技术参数有哪些呢&#xff1f;接下…

[渝粤教育] 南开大学 面向对象程序设计 参考 资料

教育 -面向对象程序设计-章节资料考试资料-南开大学【】 1-01小节测试 1、【判断题】遇到一个问题后&#xff0c;应先分析问题、设计算法&#xff0c;然后再编写程序。 A、正确 B、错误 参考资料【 】 1-02小节测试 1、【多选题】下列说法正确的是&#xff08; &#xff09;。 …

视频光端机常见故障问题及处理方法大全

在安防监控工程中&#xff0c;需要应用到很多的视频光端机&#xff0c;但是我们在使用视频光端机的过程中&#xff0c;往往不可避免的会出现一些故障问题&#xff0c;那针对这些故障问题我们该如何检测以及处理呢&#xff1f;今天&#xff0c;飞畅科技的小编为大家专门整理了几…

[渝粤教育] 南昌大学 生物化学 参考 资料

教育 -生物化学-章节资料考试资料-南昌大学【】 糖类 糖类 1、【单选题】链状结构的葡萄糖其立体异构的数目为&#xff1a; A、8 B、16 C、32 D、64 参考资料【 】 2、【单选题】环状结构的葡萄糖其立体异构的数目为&#xff1a; A、8 B、16 C、32 D、64 参考资料【 】 3、【单…

视频光端机常见问题解决方法

目前&#xff0c;高清化可以说是安防监控行业的一个发展趋势&#xff0c;视频光端机作为传输介质的终端设备&#xff0c;在整个传输过程中显得尤为重要&#xff0c;但是我们在使用视频光端机的过程中&#xff0c;往往也会遇到图像失真&#xff0c;图像跳动&#xff0c;图像质量…

[渝粤教育] 南昌航空大学 数据库原理 参考 资料

教育 -数据库原理-章节资料考试资料-南昌航空大学【】 引言 1、【多选题】在数据库界曾经获得过图灵奖学者包括&#xff08; &#xff09; A、Charles W. Bachman B、Edgar F. Codd C、James Gray D、Michael Stonebraker 参考资料【 】 数据库的4个基本概念 1、【单选题】数据…

[渝粤教育] 南通大学 智能建造风险源与安全控制 参考 资料

教育 -智能建造风险源与安全控制-章节资料考试资料-南通大学【】 绪论 1、【单选题】土木工程监测、检测、评估、加固等技术手段成为土木工程师必须掌握的技能的原因不包括&#xff08; &#xff09;。 A、基础设施投资不断增加 B、工程结构所处周边环境复杂多变 C、施工过程存…

什么是视频光端机

现如今&#xff0c;随着用户对安防要求的不断提高&#xff0c;视频监控光端机在安防领域应用的越来越广泛了&#xff0c;在安防工程项目中&#xff0c;视频光端机可以说是一个不可缺少的设备&#xff0c;在其中发挥着非常重要的作用。那么&#xff0c;什么是视频光端机呢&#…

-javaagent:_从javaagent迁移到JVMTI:我们的经验

-javaagent:当您需要从JVM内收集数据时&#xff0c;您会发现自己很危险地接近Java虚拟机内部进行工作。 幸运的是&#xff0c;有一些方法可以避免被JVM实现细节所困扰。 Java之父不仅给您提供了两个漂亮的工具供您使用。 在这篇文章中&#xff0c;我们将解释两种方法之间的差异…

视频光端机使用、保养与维护方法详解

现如今&#xff0c;在安防监控工程项目中&#xff0c;视频通信已得到了广泛的应用&#xff0c;在这其中视频光端机可以说是发挥着很重要的作用&#xff0c;视频光端机正越来越广泛的应用到安防工程项目中。那么&#xff0c;我们在工程项目中该如何使用、保养与维护视频光端机呢…

[渝粤教育] 四川农业大学 宏观经济学 参考 资料

教育 -宏观经济学-章节资料考试资料-四川农业大学【】 测试题1 1、【填空题】GDP是一国或一地区在一定时期内所生产的全部&#xff08; &#xff09;的市场价值总和。 A、 参考资料【 】 测试题2 1、【单选题】GDP是一个&#xff08; &#xff09;的概念。 A、流量 B、存量 C、…

关于视频光端机调制方式及介质特点的介绍

光端机的工作原理就是把信号调制到光上&#xff0c;再然后通过光纤来进行视频数据传输&#xff0c;那么&#xff0c;视频光端机在传输的过程当中有哪些调制方式呢&#xff1f;光纤传输的介质有哪些特点呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xf…