ArrayList使用内存映射文件

介绍

内存中的计算由于负担得起的硬件而开始兴起,大多数数据保留在RAM中以满足延迟和吞吐量的目标,但是将数据保留在RAM中会增加垃圾收集器的开销,尤其是在您不预先分配的情况下。 因此,有效地我们需要一种无垃圾/无垃圾的方法来避免GC打h

无垃圾/无垃圾数据结构

有两种选择可以实现它

对象池

对象池模式是一个很好的解决方案,我在Lock Less Object Pool博客中写过

堆外对象

JVM对创建堆外对象提供了很好的支持。 如果您走这条高速公路,并且高速公路有其自身的风险,您可以摆脱GC暂停!

就像世界上最好的一样,这是堆与堆的混合。

内存映射文件将允许映射内存中的部分数据,并且该内存将由OS管理,因此它将在正在映射文件的JVM进程中创建非常少的内存开销。 这可以帮助以无垃圾方式管理数据,并且您可以让JVM管理大型数据。 内存映射文件可用于开发IPC,我在Power-of-java-memorymapped-file博客中写道。 在此博客中,我将创建由MemoryMapped File备份的ArrayList,此阵列列表可以存储数百万个对象,几乎没有GC开销。 听起来很疯狂,但有可能。

让我们行动起来

在此测试中,我使用具有以下属性的Instrument对象

–整数ID

–双倍价格

因此,每个对象都是12个字节。 这个新的数组列表包含1000万个对象,我将尝试评估写入器/读取器的性能

作家表现

BigArrayList写入
X轴 –没有读数
Y轴 –以毫秒为单位增加一千万的时间

添加1000万个元素大约需要70毫秒,这非常快。

作家吞吐量

让我们看一下性能的另一个方面,即吞吐量:

BigArrayList WriteTP
X轴 –没有读数
Y轴 –吞吐量/秒,百万

作家吞吐量令人印象深刻,我的范围介于1.38亿1.42亿之间

读者表现

BigArrayList阅读器
X轴 –没有读数
Y轴 –读取1000万以毫秒为单位的时间

读取1000万条记录大约需要44毫秒,非常快。 凭借这种性能,您肯定会挑战数据库。
读者吞吐量

BigArrayList ReaderTP
X轴 –没有读数
Y轴 –吞吐量/秒,百万

哇吞吐量很棒,每秒220+百万

1.38亿/秒的写入器吞吐量和2.2亿/秒的读取器吞吐量来看,它看起来非常有前途。

与数组列表比较

让我们比较BigArrayList和ArrayList的性能,

作家吞吐量– BigArrayList与ArrayList

BigArrayList与ArrayList WriteTP
BigArrayList的吞吐量几乎恒定在1.38亿/秒, ArrayList以5000万 /秒开始,而下降到500万以下。

ArrayList有很多问题,这是由于

–阵列分配

–阵列复制

–垃圾收集开销

在这种情况下, BigArrayList是赢家,它比arraylist快7倍

读取器吞吐量– BigArrayList与ArrayList

BigArrayList与ArrayList ReaderTP
ArrayList的性能比BigArrayList更好,大约快1倍。

在这种情况下,BigArrayList较慢,因为

–随着请求更多数据,它必须将映射文件保留在内存中

–取消封送的成本

BigArrayList的读取器吞吐量为220+百万/秒,它仍然非常快,只有极少数的应用程序希望比此更快地处理消息。

因此,对于大多数用例来说,这应该可行。

使用以下技术可以提高阅读器性能

–从映射的流中批量读取消息

–通过使用索引来预取消息,就像CPU一样

通过进行上述更改,我们可以将性能提高几百万美元,但是我认为,在大多数情况下,当前的性能还是不错的

结论

内存映射文件是值得研究的领域,它可以解决许多性能问题。 Java现在正被用于开发交易应用程序,GC从一开始就是您必须回答的一个问题,您需要找到一种使GC保持快乐的方法,而MemoryMapped是GC会喜欢的一件事。

该博客使用的代码可在@GitHub上获得 ,我使用2gb内存进行了测试。 代码无法处理某些极端情况,但足以证明MemoryMapped文件在许多情况下都能胜出。

参考: ArrayList,使用我们的JCG合作伙伴 Ashkrit Sharma在“您准备好了”博客上的使用内存映射文件 。

翻译自: https://www.javacodegeeks.com/2013/07/arraylist-using-memory-mapped-file.html

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

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

相关文章

JVM的内存区域划分(转载)

原文链接: http://www.cnblogs.com/dolphin0520/p/3613043.html JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如…

css 如何让背景图片拉伸填充避免重复显示

如何让背景图片拉伸填充,这个问题听起来似乎很简单。但是很遗憾的告诉大家。不是我们想的那么简单。 比如一个容器(body,div,span)中设定一个背景。这个背景的长宽值在css2.1之前是不能被修改的。 所以实际的结果是只能重复显示,所…

c语言以空格分割字符串_C语言strtok()函数:用指定的分隔符分解字符串

函数名: strtok头文件:函数原型: char *strtok(char *str1, const char *str2);功能: 用指定的分隔符分解字符串参数: char *str1 为要分解的字符串const char *str2 为分隔符字符串返回值: 返回下一个分割后的字符串指针&am…

微抖动,繁忙的等待和绑定CPU

性能分析新机器 当我在新机器上工作时,我想了解它的局限性。 在这篇文章中,我将研究机器的抖动以及忙于等待本周末构建的新PC的影响。 机器的规格很有趣,但不是发布目的。 永远不要少: i7-3970X六核,运行频率为4.5 GH…

函数的指定参数

def test(r,t,p) 形参 ret test(p等等,rere,tcsss) 实参,相等后位置上不用一一对应 默认值 def drive(name): temp name "开车" return temp ret drive("一个人") print(ret) ##应该输出为:一个人开车 def drice(p,name默认值…

Python快速搭建HTTP服务器

<wiz_tmp_tag id"wiz-table-range-border" contenteditable"false" style"display: none;"> 来自为知笔记(Wiz)转载于:https://www.cnblogs.com/linux-wang/p/8142848.html

mysql导入.sql文件及常用命令_MySQL导入.sql文件及常用命令

在MySQL Qurey Brower中直接导入*.sql脚本&#xff0c;是不能一次执行多条sql命令的&#xff0c;在mysql中执行sql文件的命令&#xff1a;mysql> source d:/myprogram/database/db.sql;另附mysql常用命令&#xff1a;一) 连接MYSQL&#xff1a;格式&#xff1a; mysql -…

浏览器如何生成URL

点击页面中的链接&#xff0c;浏览器会根据源码中相对URL路径作不同的处理&#xff1a; &#xff08;1&#xff09;有协议名称&#xff0c;但没有域名信息 对于这种形式的URL&#xff0c;它的协议&#xff0c;路径&#xff0c;查询字符串和片段ID都以它自身为准&#xff0c;但…

再见了古诺。 你好Drools工作台。

Drools 6.0发生了许多变化。 随着功能和功能的变化&#xff0c;我们对Guvnor github存储库进行了重组&#xff0c;以更好地反映我们的新架构。 历史上&#xff0c;Guvnor一直是Drools的Web应用程序。 它由Drools专用的编辑器&#xff0c;后端存储库和简化的资产管理系统组成。 …

接口聚合

1.设置pc ip 192.168.1.1 192.168.1.2 2.设置端口聚合&#xff08;两个交换机设置相同&#xff09; Switch(config)#inter range f 0/1-3 Switch(config-if-range)#channel-g 1 mode act Switch(config-if-range)#sw mode trunk Switch(config-if-range)#sw trunk allow vlan …

JAVA 框架-Spring

一.准备工作 1.下载spring工具插件&#xff0c;在STS官网找到与eclipse对应版本的下载链接地址&#xff0c;复制该地址打开eclipse里的Help菜单&#xff0c;选择Install new Software选项&#xff0c;将地址粘贴到work with输入框中&#xff0c;点击add按钮&#xff0c;此时Loc…

python while break try 无法中断_解码不能正常工作并且while循环不能正确中断python...

这是一个使用Python中的TCP套接字的文件传输应用程序。文件传输协议将包含一个名为ftps.py文件一个客户打电话来ftpc.py文件. 在文件传输应用程序将使用一个简单的协议。前4个字节(按网络字节顺序)将包含后续文件中的字节数。接下来的20个字节将包含文件的名称(假设名称可以容纳…

HTML中三种定位relative,absolute,fixed后,盒子的百分比宽度及位置易错点

1 . 相对定位relative:顾名思义,相对定位是相对于自己的位置来进行偏移,如下图: 以盒子中心为基准,为每条边的正方向,例: 向右移动20px :  代码为left:20px;或者right:-20px; 向下移动20px : 代码为top:20px;或者bottom:-20px; 2 . 绝对定位:absolute 以其第一个定位的…

JMeter定制功能实现

JMeter提供了可在采样器中使用的功能。 在编写复杂的测试计划时&#xff0c;您会感到JMeter缺少某些方法。 您使用Beanshell脚本定义自己的自定义方法。 JMeter调用Beanshell解释器来运行脚本。 只要您不产生高负载&#xff08;大量线程&#xff09;&#xff0c;此方法就可以正…

vue安装

1、查看版本 npm -v cnpm -v 升级 npm cnpm install npm -g 2、cnpm install vue 3、全局安装 vue-cli cnpm install --global vue-cli 4、创建一个基于webpack模板的新项目 vue init webpack my-project 5、运行项目 cd my-project cnpm install cnpm run dev 6、报错 解决办…

BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)

题目链接 后缀数组做法见这。 直接SAMmap。对于每个节点其产生的不同子串数为len[i]-len[fa[i]]。 //15932kb 676ms #include <map> #include <cstdio> #include <cctype> #include <algorithm> //#define gc() getchar() #define MAXIN 1500000 #de…

python运行结果图_[宜配屋]听图阁

首先使用内置模块os.>>> import os>>> code os.system("pwd && sleep 2")# /User/zhipeng>>> print code# 0问题是 os.system 只能获取到结束状态使用内置模块 subprocess>>> import subprocess>>> subproces…

母函数

首先是4个重要的泰勒展开式 1. 2. 3.(e(-x)e(x))/21x^2/2!x^4/4!x^6/6!...... 4.(e(x)-e(-x))/2xx^3/3!x^5/5!x^7/7!...... 之后是两类母函数的应用 总体思路&#xff1a;利用&#xff08;x^ax^bx^c&#xff09;指数表示对某一物品取用的数量&#xff0c;系数表示方案数 1.普通…

JDK 7的算法和数据结构

在定期检查JDK中是否存在一种或另一种标准算法时&#xff0c;我决定进行这种索引。 有趣的是&#xff0c;为什么其中包含一些著名的数据结构或算法&#xff0c;而另一些却没有&#xff1f; 此调查的格式仅涉及JDK的算法和数据结构的关键特性和功能&#xff0c;所有详细信息和完…

如何在本地运行查看github上的开源项目

看中了一款很多星星的github的项目&#xff0c;想把这个项目拉到自己的电脑上运行查看项目效果&#xff0c;该怎么做&#xff1f;示例&#xff1a;我们今天要看的 github项目地址&#xff1a;https://github.com/lzxb/vue-cnode1.克隆项目&#xff1a; git clone [https://gith…