Agrona的Threadsafe堆外缓冲区

这篇博客文章解释了我们如何为线程安全操作轻松提供对堆内存的访问,从而继续了我在Agrona库上进行的系列文章 。 在继续进行之前,我可能应该警告一下,这是一个相当高级的主题,并且我不会尝试解释诸如内存屏障之类的概念,而只是概述API的功能。

ByteBuffer的不足

Java提供了一个字节缓冲区类来包装offheap和onheap内存。 字节缓冲区在Java网络堆栈中专门用作从中读取或写入数据的位置。

那么字节缓冲区有什么问题呢? 好吧,因为它们针对用例,所以它们不提供对原子操作之类的支持。 如果要编写从不同进程同时访问的非堆数据结构,则字节缓冲区不能满足您的需求。 您可能要编写的那种库的一个示例是一个消息队列,一个进程将读取该消息,而另一个进程将写入该消息队列。

Agrona的缓冲器

Agrona提供了几种缓冲区类和接口来克服这些缺陷。 Aeron和SBE库都使用这些缓冲区。

  1. DirectBuffer –提供从缓冲区读取值的功能的顶级接口。
  2. MutableDirectBuffer –扩展DirectBuffer添加操作以写入缓冲区。
  3. AtomicBuffer –不,它不是核动力的MutableDirectBuffer ! 该接口添加了原子操作以及比较和交换语义。
  4. UnsafeBuffer –默认实现。 名称unsafe并不意味着不应该使用该类,只是其支持的实现使用sun.misc.Unsafe

拆分缓冲区而不是分配单个类的决定是出于希望限制不同系统组件对缓冲区的访问权限的考虑。 如果一个类只需要从缓冲区读取,则不应允许它通过使缓冲区发生突变而将错误引入系统。 同样,不允许设计为单线程的组件使用Atomic操作。

包装一些内存

为了能够使用缓冲区执行任何操作,您需要告诉它缓冲区的起始位置! 此过程称为包装基础内存。 所有用于包装内存的方法都称为wrap并且可以包装byte[]ByteBufferDirectBuffer 。 您还可以指定用于包装数据结构的偏移量和长度。 例如,这里是包装byte[]

final int offset = 0;final int length = 5;buffer.wrap(new byte[length], offset, length);

包装还有另一个选择–这是存储位置的地址。 在这种情况下,该方法采用存储器的基地址及其长度。 这是为了支持诸如通过sun.misc.Unsafe分配的内存或例如malloc调用之类的事情。 这是使用Unsafe的示例。

final int length = 10;final long address = unsafe.allocateMemory(length);buffer.wrap(address, length);

包装内存还可以设置缓冲区的容量,可以通过capacity()方法进行访问。

存取器

因此,现在您有了可以读取和写入的堆外内存缓冲区。 习惯上,每个getter都以单词get开头,并以您要获取的值的类型作为后缀。 您需要提供一个地址,以说出要读取的缓冲区中的位置。 还有一个可选的字节顺序参数。 如果未指定字节顺序,则将使用计算机的本机顺序。 这是一个有关如何在缓冲区开始处加长的示例:

final int address = 0;long value = buffer.getLong(address, ByteOrder.BIG_ENDIAN);value++;buffer.putLong(address, value, ByteOrder.BIG_ENDIAN);

除基本类型外,还可以从缓冲区中获取和放入字节。 在这种情况下,要读取或读取的缓冲区将作为参数传递。 再次支持byte[]ByteBufferDirectBuffer 。 例如,这是将数据读入byte[]

final int offsetInBuffer = 0;final int offsetInResult = 0;final int length = 5;final byte[] result = new byte[length];buffer.getBytes(offsetInBuffer, result, offsetInResult, length, result);

并发操作

intlong值也可以使用内存排序语义进行读取或写入。 后缀为Ordered方法保证它们最终将被设置为所讨论的值,并且该值最终将在另一个对该值进行易失性读取的线程中可见。 换句话说, putLongOrdered自动执行存储存储内存屏障 。 get*Volatileput*Volatile遵循与Java中使用volatile关键字声明的变量的读取和写入相同的排序语义。

也可以通过AtomicBuffer更复杂的内存操作。 例如,有一个compareAndSetLong ,它会自动在给定索引处设置一个更新的值,因为给定的现有值是一个预期值。 getAndAddLong方法是在给定索引处添加的完全原子的方法。

生活中没有什么是免费的,所有这些都需要警告。 如果您的索引不是单词对齐的,则这些保证不存在。 请记住,它也有可能撕裂一些薄弱内存体系结构,如ARM和Sparc过字边界写入值,看到堆栈溢出对这种事情的更多细节。

边界检查

边界检查是棘手的问题之一,也是正在进行的辩论的主题。 避免边界检查可以导致更快的代码,但是会导致产生段错误并降低JVM的潜力。 Agrona的缓冲区使您可以选择通过命令行属性agrona.disable.bounds.checks禁用边界检查,但默认情况下是边界检查。 这意味着它们的使用是安全的,但是如果应用程序对经过测试的代码进行性能分析确定边界检查是瓶颈,那么可以将其删除。

结论

Agrona的缓冲区使我们能够轻松使用offheap内存,而不受Java现有字节缓冲区强加给我们的限制。 我们正在继续扩展可从Maven Central下载的库。

感谢Mike Barker,Alex Wilson,Benji Weber,Euan Macgregor和Matthew Cranman帮助他们审阅了此博客文章。

翻译自: https://www.javacodegeeks.com/2015/08/agronas-threadsafe-offheap-buffers.html

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

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

相关文章

逍遥模拟器配置burpsuite抓包环境

电脑与逍遥模拟器处于同一网段,在burpsuite中设置代理: 之后在逍遥模拟器中设置网络代理 之后直接下载下面的证书并且将其拖放到逍遥模拟器中: 证书下载地址: 链接:https://pan.baidu.com/s/1qJmcKcVj3NqmrWKf6zb83g …

在线演示一下HTML的各种实例,打发无聊的时间

这段时间入职了一家外包公司,比较闲,好像是去驻场开发做金融保险的项目,我应聘的是前端工程师的岗位,要准备刷题,听说考的范围比较广,我是电子商务专业的,本身学的就比较广,没事做做html的实例打发无聊的时间。有兴趣的可以关注我的公众号:电商程序员。各种资源都有,…

OC本学习笔记Foundation框架NSString与NSMutableString

一、NSString与NSMutableString 相信大家对NSString类都不陌生。它是OC中提供的字符串类。它的对象中的字符串都是不可变的,而它的子类NSMutableString类的对象中的字符串就是可变的。什么是可变与不可变呢?二者的差别就是在已经创建的一个字符串…

phpMyAdmin渗透利用总结

phpMyAdmin渗透利用总结 前言 总结一下常见的phpmyadmin的漏洞利用姿势 简介 phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂…

SQL之条件判断专题

Case when (case when 情况1 then 结果1 when 情况1 then 结果1 else +剩余结果 end ) 列名 IF表达式 IF(判断内容,0,1) SELECT IF( sex1,男 ,女 )sex from student IFNULL表达式 IF(判断内容,x) 假如判…

使用所有对象通用的方法

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题,包括对象创建,并发,序列化,反射等。 它将指导您完成Java掌握的过程! 在这里查看 ! 目录 1.简…

前端工程师面经——概述及面试技巧加考点篇(一)

这段时间受到疫情的影响,本身做java开发的,面试了入职了一个外包公司的前端岗位,入职属于驻场开发的那种,前几周基本没啥事,一般经理会让你刷题,到了驻场那边需要机试过关才能在那边开发,这边在牛客网,LeetCode等平台找点前端的题做一做顺便记录,仅供参考,那边做的是…

Struts2漏洞和Struts Scan工具实战

一、Apache Struts 2漏洞背景 1.漏洞详情 2017年3月6日,Apache Struts 2被曝存在远程命令执行漏洞。在使用基于Jakarta插件的文件上传功能条件下,恶意用户可以通过修改HTTP请求头中的Content-Type值构造恶意代码,在服务器上执行系统命令&…

39 网络相关函数(七)——live555源码阅读(四)网络

39 网络相关函数(七)——live555源码阅读(四)网络 39 网络相关函数(七)——live555源码阅读(四)网络 简介14)readSocket从套接口读取数据recv/recvfrom 函数 函数原型:参数说明:返回说明:本文由乌合之众 lym瞎编,欢迎转载 blog.cn…

2020年前端招聘技术概览

学习当下前端技术最好的方法就是从求职网站上找出前端的招聘要求,因为前端技术每年变化都很快,每个阶段都会不一样,这里简单从网站招聘要求罗列,仅供参考。更有针对性的是针对每个公司的招聘要求写简历,学习相关技术&a…

jexboss工具 -- JBOSS未授权访问漏洞利用

其实所有的节日,都不是为了礼物和红包而生,而是提醒我们不要忘记爱与被爱,生活需要仪式感,而你需要的是在乎和关爱。。。 ---- 网易云热评 小受:Ubuntu20 小攻:Kali2020 一、搭建该漏洞环境 查看上一篇文章…

sublime text 3 前端开发常用插件

sublime text 3 前端开发常用插件https://packagecontrol.io/browse 代码对齐:Alignmenthtml代码补全: EmmetCoffeeScript语法: Better CoffeeScriptcss格式化: CSS Formatless语法: LESSjs代码格式化:JsFormat代码注释文档: DocBlockr代码美化: HTML-CSS-JS Prettify 去除行尾…

前端工程师有哪些面试技巧值得掌握?

这段时间受到疫情的影响,本身做java开发的,面试了入职了一个外包公司的前端岗位,入职属于驻场开发的那种,前几周基本没啥事,一般经理会让你刷题,到了驻场那边需要机试过关才能在那边开发,这边在…

java 模块化_Java模块化方法–模块,模块,模块

java 模块化我想每个人都会同意,编写模块化应用程序和模块化通常是一件好事。 但是,从Java和Scala语言以及各种Java / Scala框架来看,对模块化的支持看起来如何? 有很多不同的方法! 让我们看看其中的一些。 “保护”以…

Fastjson批量检查及一键利用工具

0x01 序章 上次讲解过手动利用fastjson,但讲的过于太简单了。根据大家的反应,收集如下几个问题。 1、如何盲打fastjson 2、判断fastjson的指纹 3、各版本payload以及使用ldap模式监听。 下面我就一一解答,我只是把我在网上查到的资料消化 后分…

动态规划--重拾我的“背包”

前言: 背包问题所涉及的是经典的动态规划算法。因为长时间不AC了,渐渐感觉思维也都麻了!本文将基础的背包问题做个小结,方便以后翻阅。感兴趣的朋友也可以阅读一下~------------------------(1)如何从n个重…

CSS3学习笔记总结,你值得拥有(呕心沥血之作,涵盖CSS3所有知识点)

目录 简介 边框 圆角 背景 渐变 文本效果 字体 2D转换 3D转换

Java 8 SE可选,严格的方法

大约两周前,Stephen Colebourne提出了使用Optional的实用方法 。 如果您阅读了它,您可能会从我以前的建议中猜到我不同意。 总览 我必须以免责声明开头,但随后我将直接解释为什么我认为他的方法不够理想。 所有不归因于他人的报价均摘自Ste…

routersploit简单实例

https://github.com/reverse-shell/routersploit RouterSploit。它包含了27个品牌的上百种漏洞利用模块,涉及的路由器、摄像头等设备有几百种。渗透的时候,用户首先根据目标设备的品牌选择对应的扫描模块,用以发现漏洞。一旦漏洞识别&#x…

《Spring3.0就这么简单》

第一章 认识Spring 1、Spring提供的IOC容器,是Spring大杀器之一。容器将对象之间的依赖关系交给Spring进行控制,采用配制的方式对依赖关系进行描述,由Ioc容器负责依赖类之间的创建、拼接、管理、获取工作 2、Spring提供的第二大杀器&#xff…