sun.misc.Unsafe和堆外内存

sun.misc.Unsafe类允许您执行许多Java中不应该做的事情,但是在非常特殊的情况下仍然有用。 必须在99%的时间避免这种情况,但是在极少数情况下,这是唯一有意义的解决方案。

这篇文章考虑了它在OpenHFT中的使用方式以及我希望在Java 9中看到的功能。特别地,可以通过这种方式完成访问大量内存而不影响GC的工作。 只有在Java中才能通过这种方式在进程之间共享内存,而不会产生大量开销。

分配和释放堆内存。

public native long allocateMemory();
public native void freeMemory(long address);

这两种方法允许您分配任何大小的堆外内存。 它不限于Integer.MAX_VALUE字节,您会获得原始内存,可以在其中应用边界检查。 例如,Bytes.writeUTF(String)计算编码字符串的长度,并检查整个字符串是否适合一次(而不是每个字节)。

Java-Lang使用与DirectByteBuffer用来确保释放内存相同的内部Cleaner类。 理想情况下,这不会那么内部。

原始访问内存

public native Xxx getXxx(Object, long offset); // intrinsic
public native void putXxx(Object, long offset);// intrinsic

在这两种情况下,处理堆外内存时,Object均为null,并且偏移量只是地址。 这使您可以使用针对JVM的单个机器代码指令来执行RAW内存访问,这些指令会威胁到它们作为内在函数。 这显着提高了内存访问的性能。

这种原始方法的问题在于,您必须自己管理数据结构中字段的布局。 Java-Lang库通过允许您定义getter和setter的接口(甚至对于String和enums等对象类型)来解决此问题,它将在运行时生成实现。 即,您可以访问getter / setter,而无需知道“对象”已脱离堆。

线程安全访问内存

public native Xxx getVolatileXxx(Object, long offset); // intrinsic
public native void putOrderedXxx(Object, long offset); // intrinsic

这两种方法使您可以将惰性字段与惰性集一起使用。 对于设置线程,惰性设置速度更快,但是如果设置得太快,则可能导致同一线程读取旧值。 解决方案是不要读取您刚刚编写的值。

当在进程之间共享数据时,这些方法特别有用。

CAS操作

public native boolean compareAndSwapXxxx(Object, long offset, Xxx expected, Xxx setTo) // intrinsic

此方法对于构建锁定堆至关重要。 特别是在进程之间以线程安全的方式共享数据的最有效方法。 在我对Haswell i7-4500处理器进行的测试中,同一台计算机上两个进程的往返延迟通常是这样。

TCP协议 – 9微秒。
文件锁 – 5.5微秒。
中国科学院 – 0.12微秒。
有序写 – 0.02微秒(半往返,如果可以使用此模式)

堆对象分配

public native Object allocateInstance(Class clazz);

在反序列化一个类时,您希望按照序列化时的方式重新构造该类中的值。 如JEP 187:序列化2.0所述,这不适用于当前的构造函数,一种解决方法是完全避免构造函数,并创建实例而不调用实例。 这在很大程度上取决于信任您拥有的数据,但是它具有易于使用的优点,并且不假设您拥有哪些构造函数。

结论

经常注意到,在没有网络开销的情况下,嵌入式数据库可以在延迟方面胜过分布式数据库。 我相信下一代低延迟数据库将提供嵌入式性能并在进程之间共享,并且更新和查询响应时间都将大大低于一微秒。

我认为没有理由不应该在Java中实现这些功能。 对于Java用户,本机接口性能最佳,因为它不需要JNI或将世界的C视图转换为Java视图。

参考: sun.misc。来自Vanilla Java博客的JCG合作伙伴 Peter Lawrey提供的不安全和堆外内存 。

翻译自: https://www.javacodegeeks.com/2014/01/sun-misc-unsafe-and-off-heap-memory.html

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

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

相关文章

jq获取input选取的文件名_tushare获取交易数据并可视化分析

获取数据是金融量化分析的第一步,找不到可靠、准确的数据,量化分析就无从谈起。随着信息技术的不断发展,数据获取渠道也越来越多,尤其是Python网络爬虫,近几年愈来愈火。然而,很多人毕竟精力有限&#xff0…

linux电脑做笔记软件,知识管理工具, 自由格式数据库, 笔记软件以及个人信息管理...

myBase Desktop 7.3.5 for Linux/MacOSX/Windows 2020-2-20新增 [数学公式 MathJax for Markdown]、[自动锁屏保护]、[粘贴图片为附件]、[完整复制带图片内容],以及部分问题修订,详见:更新日志;数学公式插件:缺省安装后…

js模板引擎

模板引擎 function tmpl(str, o) {return str.replace(/\\?\{([^{}] )\}/g, function (match, name) {return (o[name] undefined) ? : o[name];});}调用示例 var html tmpl(html, { user_id: user_id, user_name: user_name });更多专业前端知识,请上 【猿204…

原来游戏技术行业最大的秘密竟然是...

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云社区专栏 本篇文章主要是分享游戏业务面临的安全风险场景,以及基于这些场景的特点,我们应该如何做好对应的防护。 【一、背景:游戏行业DDoS攻击…

Leetcode 565. Array Nesting

题目 链接:https://leetcode.com/problems/array-nesting/ Level: Medium Discription: A zero-indexed array A of length N contains all integers from 0 to N-1. Find and return the longest length of set S, where S[i] {A[i], A[A[i]], A[A[A[i]]], ... }…

指定Gradle构建属性

属性是用于轻松自定义Gradle构建和Gradle环境的宝贵工具。 我将在本文中演示一些用于指定Gradle构建中使用的属性的方法。 Gradle支持项目属性和系统属性 。 这篇文章中有趣的是两者之间的主要区别是如何访问它们。 通过常规Java / Groovy系统属性访问方法访问系统属性时&…

python数字转中文字符_Python实现中文数字转换为阿拉伯数字的方法示例

本文实例讲述了Python实现中文数字转换为阿拉伯数字的方法。分享给大家供大家参考,具体如下: 一、需求 今天写了三千二百行代码。 今天写了3200行代码。 两行意思相同,只是表达方式不太能够,统一掉。 二、原理 数字的特征是 数字 …

调程序时的小错误

1.未能找到类型或命名空间名称“Form1”(是否缺少 using 指令或程序集引用?) 应该是复制代码的时候,把程序入口处的命名空间和Form1的命名空间不一致 2.检索 COM 类工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040…

eclipse中设置Linux编码环境,更改eclipse中console编码

1.在eclipse.ini的-vmargs下面加上「-Dfile.encodingUTF-8」。2.eclipse-->Window-->Preferences-->General-->Workspace-->Text file encoding-->UTF-83.Installed JREs-->Default VM Arguments:-->-Dfile.encodingUTF-84.eclipse-->Run-->Run …

[记录] JavaScript 中的BOM操作

转载于:https://www.cnblogs.com/yuxi2018/p/9520059.html

GC对吞吐量和延迟的影响

每个Java应用程序都必须解决的一种类型的问题与垃圾回收有关。 当垃圾收集器工作时,它代表了一项奇妙的发明。 如果不是这样,或者GC做家务的方式变得不可预测,那么您就有一个朋友变成了敌人。 这篇文章是关于垃圾收集暂停时间的。 或更准确地…

linux odbc连接数据库失败,在Linux中使用RODBC连接到SQL Server时出错

我在linux服务器上运行不同的r程序。程序因数据库连接失败而出现以下错误: -1: In odbcDriverConnect(paste0("DRIVER{SQL Server}; server", server,: [RODBC] ERROR: state 08001, code 0, message[unixODBC][FreeTDS][SQL Server]Unable to connect to…

高级cmd攻击命令_一步一步学习DVWA渗透测试(Command Injection命令行注入)-第七次课...

各位小伙伴,今天我们继续学习Command Injection,翻译为中文就是命令行注入。是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。在OWASP TOP 10中一种存在注入漏洞,最常见的就是SQL和命令行注入。PHP开发的…

IDEA插件之 CodeGlance

在编辑代码最右侧,显示一块代码小地图 这款插件使用效果图如下,个人感觉还是有点用处,滚动条太小,有这个地图,拖动起来更加方便一点 原文地址:http://tengj.top/2017/02/22/idea1-1/转载于:https://www.cnblogs.com/al…

移动端图片上传方法

移动端图片上传方法 实现效果 文件下载 http://files.cnblogs.com/files/sntetwt/移动端图片上传.rar 实现步骤 一、隐藏<input type"file" id"file" name"Filedata" style"display:none;" accept"image/*" /> 二、…

SQL UPDATE with INNER JOIN

mysql - SQL UPDATE with INNER JOIN - Stack Overflowhttps://stackoverflow.com/questions/14491042/sql-update-with-inner-join MySQL UPDATE JOIN | Cross-Table Update in MySQLhttp://www.mysqltutorial.org/mysql-update-join/ 转载于:https://www.cnblogs.com/rgqancy…

linux 29900端口,USB2.0接口100M以太网芯片SR9900(A)的应用

1&#xff1a;SR9900A和SR9900有啥区别&#xff1a;(就是同一颗料)SR9900A默认随机MAC地址&#xff1a;00E0XXXXXXXXXXSR9900默认纯0MAC地址&#xff1a;000000000000都可以二次烧录MAC地址的… 如果SR9900没货用SR9900A没问题的&#xff0c;但是SR9900A没货&#xff0c;用SR99…

easyui常见问题

1.EasyUI的combobox可以看到选项但是不能选择怎么办 检查一下绑定的字段是否名称一样&#xff0c;valueField:id,textField:name&#xff0c;主要检查valueField $(#contentsName).combotree({panelHeight: auto,panelMaxHeight: 200,multiple: false,required: false,editable…

c语言最大公约数和最小公倍数_五年级奥数课堂之七:公因数和公倍数

乘积尾0的个数公因数和公倍数的基本概念公因数的释义给定若干个整数&#xff0c;如果有一个(些)数是它们共同的因数&#xff0c;那么这个(些)数就叫做它们的公因数。而全部公因数中最大的那个&#xff0c;称为这些整数的最大公因数。公约数与公倍数相反&#xff0c;就是既是A的…

RxJava:从未来到可观察

大约4年前&#xff0c;我第一次在Matthew Podwysocki的博客上遇到了Reactive Extensions &#xff0c;但是直到我几周前看到Matthew在Code Mesh上发表演讲之后&#xff0c;我才对它有所了解。 它似乎最近变得越来越流行&#xff0c;我注意到&#xff0c;现在有一个由Netflix编…