ChronicleMap –具有堆外内存的Java体系结构

我的上一篇文章是在几周前写的,在收到一些有效的反馈后,我想澄清几点,作为本文的序言。

“ 使用零垃圾创建数百万个对象 ”的主要收获应该是,使用Chronicle,在编写Java程序时,您不会“局限于”使用jvm分配的堆内存。 也许这篇文章更恰当地标题为“使用零堆创建数百万个对象”。 我想指出的另一点是,当您没有堆内存时,不会引起GC活动。

我使用术语“垃圾”来描述分配在堆上的对象的事实使人感到困惑。 尽管分配的对象引起GC活动,但实际上它们不是垃圾。

我设计了一个示例来说明一个,一个是ChronicleMap不使用堆内存,而ConcurrentHashMap则使用第二个;当您使用堆内存时,您不能忽略GC。 至少您需要仔细调整系统,以确保您不会因为长时间的GC暂停而遭受痛苦。 这并不意味着从堆外分配没有任何问题(请参阅本文的结尾),也并不意味着您无法通过堆上解决方案进行优化以消除GC。 摆脱困境绝不是解决所有Java性能问题的灵丹妙药,但是对于非常具体的解决方案,它可以提供有趣的机会,我将在本文中讨论其中的一些机会。

有时可能需要在JVM之间共享数据。

现在让我们简化一下,假设您有两个JVM在同一台计算机上运行,​​其中一个或两个都希望看到彼此的更新。 每个Java程序都有一个ConcurrentHashMap ,它将对其进行更新,这些更新将被存储并在以后可供使用。 但是,程序如何将另一个Java程序应用的更新获取到其映射?

从根本上讲,不能在JVM之间直接共享HashMapConcurrentHashMap类的JDK堆集合。 这是因为堆内存由分配它的JVM包含。 因此,当JVM退出时,内存被释放并且数据不再可用,因此没有在JVM的生命周期之外持久保留内存的隐式方法。 因此,您需要找到其他机制来在JVM之间共享数据。 通常,您可以将数据库用作外部共享存储和消息传递服务,以将数据更新发送给其他进程,以通知他们某些数据已被更新。

这导致以下体系结构:

20150330_095411

这种体系结构的问题是,使用会丢失HashMap的内存速度,特别是如果写入数据库的速度不是那么快,并且您希望在通过消息传递服务发送消息之前坚持写操作。 同样,许多解决方案都将涉及TCP调用,这可能再次成为延迟的源头。

当然,与使用诸如将日志记录到磁盘的机制(例如,使用ChronicleQueue之类的产品)写入成熟的数据库相比,存在持久化数据的方法要快得多。 但是,如果您确实使用日志,则仍然必须建立所有逻辑以在重新启动时重新创建Map数据结构,更不用说必须在另一个JVM上保持Map类型结构的最新状态。

(您可能根本想保留数据的原因是,这样您应该能够在重新启动时进行恢复,而不必从源中重播所有数据)。 除了此体系结构引入的延迟之外,还必须处理数据库和消息传递服务的额外代码和配置。

即使接受这种功能都可以封装在框架中,如果您的内存Map实际上在JVM外部可见,那不是很好。 Map应该能够隐式持久化数据,以便其数据独立于JVM的生存时间可用。 它应该允许使用与使用堆上映射相同的“内存”速度进行访问。

这就是ChronicleMap用处ChronicleMapjava.util.ConcurrentMap的实现,但重要的是,它使用了堆外内存 ,该内存在JVM外部对于计算机上运行的任何其他进程都是可见的。 (有关堆上内存与堆外内存的讨论,请参见此处 )。

每个JVM将创建一个指向相同的内存映射文件的ChronicleMap 。 当一个进程写入其ChronicleMap ,另一个进程可以立即(约40纳秒)在其ChronicleMap查看更新。 由于数据存储在JVM外部的内存中,因此JVM退出不会导致任何数据丢失。 数据将保存在内存中(假设不需要分页),并且在JVM重新启动时,它可以非常快速地将其重新映射。 丢失数据的唯一方法是,如果操作系统崩溃而脏页尚未保存到磁盘上,则该操作系统崩溃。 解决方案是Chronicle 支持的使用复制,但超出了本文的范围。

其架构就是这样的:

20150330_102223

有关ChronicleMap入门的代码示例,请参阅我的上一篇文章或此处的官方ChronicleMap教程。

在进入ChronicleMap之前,需要考虑很多注意事项和权衡取舍。

  • ChronicleMap条目必须可序列化。 对于对性能非常敏感的系统,您需要实现Chronicle提供的称为BytesMarshallable的自定义序列化。 尽管这很容易实现,但堆映射并不是必需的。 (话虽如此,将数据存储到数据库中当然也需要某种序列化方法。)
  • 即使使用BytesMarshallable序列化,任何序列化的开销对于某些系统而言也可能很重要。 在这种情况下,可以采用Chronicle支持的零拷贝技术(有关更多详细信息,请参阅我的上一篇博客文章 ),以最大程度地降低序列化的成本。 但是,与使用“普通” Java相比,实现起来有些棘手。 另一方面,在对延迟敏感的程序中,它将具有不创建任何对象的巨大好处,这些对象随后可能需要由GC清理。
  • ChronicleMap不会调整大小,因此必须预先调整大小。 如果您不知道预期有多少个项目,可能会出现问题。 但是,应该指出的是,至少在Linux上,过度设置不是一个大问题,因为Linux被动分配内存。
  • 编年史依靠操作系统异步刷新到磁盘。 如果要绝对确定数据已实际写入磁盘(而不是仅保存在内存中),则需要复制到另一台计算机。 实际上,任何关键任务系统都应复制到另一台机器上,因此在采用《纪事报》时这可能不是大问题。
  • ChronicleMap将受到操作系统内存分页问题的影响。 如果内存已调出并且必须换回,则延迟会引入系统。 因此,即使您能够创建大小远远超过主内存的ChronicleMaps,您也必须意识到根据数据访问模式的不同,可能会发生分页。

翻译自: https://www.javacodegeeks.com/2015/04/chroniclemap-java-architecture-with-off-heap-memory.html

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

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

相关文章

下列不属于html5语义元素,HTML5 新的语义元素

HTML5 提供了新的语义元素来明确一个Web页面的不同部分:HTML5中新的语义元素HTML5 元素标签定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分。根据W3C HTML5文档: section 包含了一组内容及其标题。WWFThe World Wide Fund for Nature (WWF) is....HTM…

干加个偏旁可以变成什么字_面试官:“干”字加一笔,变成什么字?回答王和午字不对...

随着大学生的增多,如今的求职者进入职场,想到一份心仪的工作,最让人头疼的就是面试,越来越多的企业都需要全能型的人才,从而在面试的时候不仅要考核专业知识,面试官还要费尽心思出各种各样的题来考验求职者…

Oracle研学-查询

学自B站黑马程序员 1.单表查询 //查询水表编号为 30408 的业主记录 select * from T_OWNERS where watermeter30408 //查询业主名称包含“刘”的业主记录 select * from t_owners where name like %刘% //查询业主名称包含“刘”的并且门牌号包含 5 的业主记录 select * from…

国际站html代码,国际站必须看得懂的HTML代码

国际站必须看得懂的HTML代码國産〇〇柒大家每天都忙着找关键词,忙着写标题,忙着做各种的优化。目的就是想把自己的产品排名到前面,获得更多的曝光,带来更多的询盘。在这个过程中我们是客服同事也是一名搜索优化人员,但…

phoengap–node+websocket在线聊天室

该实验项目基于: phonegapnodewebsocket可以应用于android 和 ios平台。 已经测试通过。以下是测试的图: 首先是用node 架设服务器。 基本上都node 基于websocket的。 主要是对message做处理和判断来进行输出和逻辑处理 而客户都,由于android…

中音萨克斯指法表图_萨克斯的几个特殊指法记忆和几个概念

大家在平常的练习和吹奏的时候,经常会出现找不到相应的指法的情况,有经验的萨友们通过长时间的摸索,会找到其中的一些规律。实际上,能看懂“一图在手,不用再担心找不到指法了”里面的表格,可以起到同样的作…

git配置和使用

1、注册bitbucket用户登录bitbucket站点https://bitbucket.org/注册一个用户,注册后用户名为linjiqin,邮箱为linjiqindkhs.com。 2、Create repository(仓库)登录bitbucket,点击“Create”按钮会出现一个Create a new repository页面&#xf…

操作系统饥饿现象_操作系统心得体会

一、操作系统1.基本概念操作系统简称OS,是配置在计算机硬件上的第一层软件,它能够有效的组织和管理计算机系统中的硬件和软件资源,合理的组织计算机工作流程,控制程序的执行,并向用户提供各种服务功能。OS是现代计算机…

组态王怎么做超级曲线_鸭肉怎么做?大叔教你红烧鸭块,香气扑鼻,简单易做,超级好吃...

晚餐总是要有硬菜上桌的,所谓硬菜无非是鸡鸭鱼肉,买只鸭子吧,倒也是不在乎哪天吃大荤,鸭子算是减肥食谱,对高血压,心脏病有一定的好处,另外,癌症病人不能吃鸡,鸭子却是可…

使用Spring的缓存管理器缓存Web内容

在这篇文章中,我想向您展示如何使用Spring的CacheManager, Cacheable和JMX批注来缓存和管理Web内容的缓存的基础知识。 想象一下一个网上商店,它从远程WCMS(Web内容管理系统)获取一些内容,例如页眉&#xf…

学水利的想转行计算机,为什么说千万别学水利水电工程?附水利八大院排名2020年(最新)...

选择科目测一测我能上哪些大学选择科目领取你的专属报告>选择省份关闭请选择科目确定v>水利水电工程一直是国家建设中离不开的一个环节,该专业在父母眼中是也很有前途的专业,但近几年,许多人不太看好水利水电工程专业了,甚至…

【WP8】ResourceDictionary

WP8中引用资源字典 当我们定义的样式太多的时候,我们可以把样式分别定义在不同的文件中,然后通过 MergedDictionaries 应用到其他资源字典中,看下面Demo 我们可以把样式定义在多个文件中,然后再App.xaml中引用 我们先定义三个文件…

python夹角余弦雷达图_雷达导论PART-II.1 无线电波与交变电流信号

今天开始进入第二篇-必要的准备知识,全部的篇章结构见我的第一篇文章“雷达导论 引言”。第二篇有3个章节,如下图所示,分别是第4章-无线电波与交变电流信号、第5章-用一种非数学的方法理解雷达、第6章-雷达的数学预备知识。今天先讲第4章&…

Oracle Java Mission Control:终极指南

“我们喜欢关注Mikhail Vorontsov的博客,并获得他对Java Performance相关问题的看法。 我们曾多次被问到Takipi的Java错误分析与Java Mission Control和Java Flight Recorder有何不同。 因此,尽管工具之间的差异很大(主要是,JMC主…

用计算机演奏打上花火,米津玄师打上花火歌词中文谐音(最好要简单全面)

满意答案.Ador2020.03.19采纳率:60% 等级:14已帮助:2446人打上花火 - 《升起的烟花,从下面看?还是从侧面看?》主题曲 词:米津玄师 曲:米津玄师xDAOKO有些地方一些音不对请见谅哈 …

两个向量之间的夹角公式_关于平面向量夹角求参数取值范围的两种基本解法介绍...

平面向量的夹角问题是考察高中向量知识掌握程度的常考内容,主要涉及到的知识点是平面向量的数量积公式。在这里介绍一道常见的平面向量题目,通过两种最基本的解法,来帮助同学们理解向量之间的夹角。填空题第15题:设平面向量a(-2&a…

宿迁学院的计算机系怎么样,宿迁学院是几本 学生评价怎么样好不好(10条)

宿迁学院是几本 学生评价怎么样好不好(10条)考生之前的努力奋斗就是为了高考报志愿时有更多的底气和把握。而俗话说,三分考、七分报,有很多考生和家长都还不太了解大学的一本、二本、三本之分,本科高校只有一个层次和等级,就是(本…

Google Guava:您永远不会知道的5件事

每个开发人员都可以使用哪些鲜为人知的Google Guava功能? 它是那里最受欢迎的库之一,它是开源的,您可能已经知道了,它来自人们玩Quidditch作为一项真正的运动的地方(至少在The Internship上 )。 它不是哈利…

hql中获取前一天的数据_PostgreSql 怎么获取数据库中关键系统信息(一)

如何通过SQL 的方式获得数据库中的一些关键信息,是一个DB最正常的工作,如何通过一些SQL来获得PG的一些关键的参数和信息或者是数据库中的一些信息是需要知道的一件事情。以下是部分 1一般来说每种数据库中都有一个或几个系统的数据库,在PG中s…

计算机信息技术为教育带来的变化,信息技术对课堂教学带来的变化

信息技术对课堂教学带来的变化谈一谈信息技术对教育教学的影响以及给课堂教学带来的变化龙川县培英学校 骆俊武在信息技术迅速发展的今天,计算机的应用、网络技术应用,直接影响着学校的的教育教学系统、学校的教育模式、教第一文库网师的教学方法。与传统…