arraylist内存溢出_ArrayList使用内存映射文件

arraylist内存溢出

介绍

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

无垃圾/无垃圾数据结构

有几种选择可以实现它

对象池

对象池模式是一个很好的解决方案,我在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文件在许多情况下都能胜出。

参考:来自我们的JCG合作伙伴 Ashkrit Sharma的使用内存映射文件的ArrayList ,在Are you ready博客上。

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

arraylist内存溢出

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

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

相关文章

【vtkWidgetRepresentation】第十八期 vtkHoverWidget

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkHoverWidget,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. vtkHoverWidget vtkHoverWidget用于在呈现窗口中…

Java面向对象(2)--类的成员属性

基本格式:修饰符 数据类型 属性名 初始化值 ; 说明1: 修饰符 ①常用的权限修饰符:private、缺省、protected、public ②其他修饰符:static、final 说明2:数据类型 任何基本数据类型和任何引用数据类型。 说明3:属性…

mysql8.0设置用户权限_mysql8.0建立用户授予权限报错解决方法

我遇到错误一:Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘IDENTIFIED BY ‘11111” at line 1;我遇到的错误二:Error C…

使用Spring Session和JDBC DataStore进行会话管理

在Web应用程序中,用户会话管理对于管理用户状态至关重要。 在本文中,我们将学习在集群环境中管理用户会话所遵循的方法,以及如何使用Spring Session以更加简单和可扩展的方式实现它。 通常在生产环境中,我们将有多个服务器节点&a…

Java面向对象(3)--类的成员方法

基本格式: 修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, …){方法体程序代码;return 返回值; }修饰符:public,缺省,private, protected等 返回值类型: ①没有返回值&#xff1a…

java 线程安全的单例_线程安全的单例模式的几种实现

单例模式是常见的设计模式之一:目的是节省内存,限制了实例的个数;有利于java GC回收机制。单例模式的三个好处:1.控制资源的使用,通过线程同步来控制资源的并发访问2.控制实例的产生个数,来达到节约资源的目…

Java面向对象(3.1)--方法的重载,可变个数的形参,值传递机制,递归

重载 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数 类型不同即可。 与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类 型或者多个参数时参数类型顺序)。调用时,根据方…

python统计图像直方图_计算机视觉7-像素点直方图统计、掩膜图像

1.灰度图的直方图(1)调用库import cv2import matplotlib.pyplot as pltimport numpy as np #创建掩膜时需要(2)绘图-方法1imgcv2.imread(F:cat.jpg,0)plt.hist(img.ravel(),256,[0,256])plt.show()plt.hist是一个画直方图的命令;img.ravel()可以将图片转化成一维数组…

计算机二级web题目(8.1)--综合选择题2

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 1、一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再…

java支持的数据类型有哪些_Java支持的数据类型有哪些?什么时候自动装拆箱?...

java中的8种基本数据类型:boolean byte char short int float double long自动拆装箱的问题引入:由于在一开始学习java的时候,”万物皆对象“这种面向对象的看问题方式,时刻围绕在脑海中。因为静态的变量和基本数据类型不属于对象…

Java面向对象(4)--封装和隐藏

Java中通过将数据声明为私有的(private),再提供公共的(public)方法:获取getXxx()和设置setXxx()实现对该属性的操作,以实现下述目的: ①隐藏一个类中不需要对外提供的实现细节。 ②使用者只能通过事先定制好的方法来访…

跑来跑去:假人与AWS Lambda的第一次接触

一切始于埃及人在一个木框上滑动几块大理石以简单的算术使其大脑放松。 或许是希腊人发明了Antikythera机制来追踪行星的运动至每千年2度的精度 。 无论哪种方式,计算都已经走了很长一段路:查尔斯巴贝奇的分析引擎 ,艾伦图灵的Enigma-breaker…

(2.1)HarmonyOS鸿蒙Ability创建,XML和Java页面布局UI

鸿蒙UI中,提供了两种编写布局的方式: ①在XML中声明UI布局 ②在Ability代码中直接通过Java创建布局 这两种方式创建出的布局没有本质差别,但是XML方式较为方便简单。 在XML文件中布局 与HTMLCSS的前端布局类似,通过使用不同类型的…

cstring越界_CString和char*的转换

方法1、const char*转换CString str;const char *p(const char*)str;const char *表示你对字符串只读,所以这时候可以直接获取。方法2、使用强制类型转换如需要对字符串写权限,则:CString str;char *p (char *)(const char *)str;方法3、使用…

使用Azure Blob存储托管Maven工件

如果您使用Microsoft Azure并且将Java用于项目,则Azure Blob存储是托管团队工件的理想场所。 它很容易设置,而且很便宜。 如果您对它们的功能不特别感兴趣,那么它比设置现有存储库选项(jfrog,nexus,archiv…

(2.2)HarmonyOS鸿蒙页面跳转

本文页面跳转基于《Ability创建子页面布局》所存在的两个页面MainAbility和SecondAbility。 在MainAbilitySlice中进行代码编写 package com.example.myapplication.slice;import com.example.myapplication.ResourceTable; import ohos.aafwk.ability.AbilitySlice; import o…

java 将换行代替_Java批量将文件中的段落替换成空格,根据指定分隔符换行(SQL示例)...

我的需求是SQL文件中有成千的类似数据,我要将它们进行转换格式,如下图第一步:将字符段楼替换,使用word排版把数据拷贝到word中,使用特殊字符替换点击全部替换,替换之后如下图,这时候它是一串很长…

wicket_Wicket模型的干净方法

wicketApache Wicket Web框架的核心概念之一是模型和IModel作为其编程接口。 Wicket组件严重依赖模型,这使它们成为体系结构的重要组成部分。 Apache Wicket是一个有状态框架,将页面及其组件存储到通常位于HTTP会话中的页面存储中。 组件根据模型的内容创…

计算机二级web题目(8.2)--基本操作题2

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 1.在考生文件夹下的Web1目录中,存有1.htm文件,该文件不完…

java的选项板_CAD工具选项板的介绍以及新建方法

CAD中的工具选项板是【工具选项板】窗口中选项卡形式的区域,不但能提供组织、共享和放置块及填充图案的很有效的方法,还能够包含由第三方开发人员提供的自定义工具。【工具选项板】窗口包括注释、建筑、机械、电力、图案填充和土木工程等选项板。当需要向…