使不安全变得更加安全

总览

如果直接使用Unsafe,则可能会导致JVM崩溃。 当您访问尚未映射的内存页面并且在Unix上的结果是SIGSEG(如果您访问页面0)或SIGBUS(如果您访问另一个未映射的页面)时,就会发生这种情况。

使用MethodHandles

用MethodHandle包装不安全的方法是可能的解决方案。 您可以将代码添加到“方法句柄”以检查零页面访问。 例如unsigned_ptr <4096。您应该将其添加到MethodHandle的原因是,它可以使优化检查变得更容易。

缺点是

  • 您必须使用MethodHandles,它会使语法复杂化,并掩盖您的实际工作。
  • 如果你不这样做是行不通的
  • 它不涵盖总线错误,也不涵盖总线错误,因为整个应用程序的映射很复杂,并且可以随时在任何线程中更改。
  • 优化边界检查需要优化器进行一些工作,这有待证明。

使用信号

如果已经有某种方法可以在硬件中做到这一点,那就可以了。 CPU已检查您尝试访问的页面是否有效,如果该页面不在缓存中,它将引发中断。 如果操作系统无法找到/创建此高速缓存未命中的映射,则此中断将变为信号。

如果JVM中已经只有一个信号处理程序,并且确实存在,那就是产生崩溃报告的原因。

如果只有某种方式,中断处理程序可以将错误或异常触发回触发它的代码。 就像Thread.currentThread()。stop(e); (你明白了)

优点

  • 由于CPU已经完成了检查,因此不需要其他工作。
  • 对优化器的最小更改(如果有)。
  • 可能适用于从各种来源产生的信号。
  • 使用信号是捕获Java之前的运行时错误的成熟/旧技术方法。

缺点

  • 单一处理可能是一个停下来的操作(当前无法在Java中对其进行基准测试)
  • 即使不是,触发错误时它的成本也可能更高。
  • 您将不得不更改传统上未更改的信号处理程序。 即,有更多的经验来改变优化器。

可能引发的异常

可能会引发新的异常,但是我建议重用现有的异常。

访问页面0 – NullPointerException

访问页面0(不仅仅是访问NULL指针)将触发SIGSEG。 NPE是根据C对NULL指针的访问来命名的,与访问引用相比,使用NPE访问NULL指针可能更明显。 也就是说,由于Java没有指针,它可能被称为NullReferenceException。

无效的访问– IndexOutOfBoundsException

其他候选对象包括BufferUnderflowException(如果您的页面缺少映射区域),BufferOverflowException(如果您的页面没有映射区域)。

这些都是它们的共同点是它们是RuntimeException(s)。 如果引发了一个自定义的,更具描述性的异常,则RuntimeException可能与抛出的现有throwables一致。

结论

使性能最大化的常见技巧是: 不要用Java编写系统已经为您完成的事情。 在Chronicle中,我们使用OS对磁盘进行异步持久化,并且比再次用Java编写持久化磁盘更高效,更可靠。 同样,如果重新使用CPU和OS提供的功能,则捕获和处理无效的内存访问将更有效,更可靠。

一般来说,当每个操作系统做不同的事情以支持跨平台兼容性时,您都将重新编写操作系统功能,但是这样做仅需最低要求。 这就是为什么Java没有线程调度程序,并且相对而言,它几乎无法控制线程的运行方式。

虚拟内存处理非常古老且标准,以至于主要平台的工作方式基本相同。

翻译自: https://www.javacodegeeks.com/2014/06/making-unsafe-safer.html

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

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

相关文章

二分搜索树的基本实现

基本操作的动画演示 插入&#xff08;略&#xff09; 搜索&#xff08;略&#xff09; 删除节点 代码 package com.yunche.datastructure;import java.util.LinkedList; import java.util.Queue;/*** ClassName: BST* Description: 二叉搜索树&#xff1a;每个节点的左子树的值…

js ||

||或位符号 a || b 1.当a ,b 均为true时&#xff0c;return a 2.当 a,b均为false时&#xff0c;return b 3.当a,b为一false一true,return true的那个值 && 与位符号 a&&b 1.当a,b均为true时&#xff0c;return b 2.当&#xff0c;b均为false时&#xff…

计算机c语言二级题型,计算机二级C语言题型和评分标准

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼全国计算机二级考试大题把题目给定程序删除了&#xff0c;正确运行&#xff0c;这样会不会给分&#xff1f;50、请编写函数fun, 函数的功能是: 将M行N列的二维数组中的数据, 按列的顺序依次放到一维数组中。函数fun中给出的语句仅供…

什么是Mockito Extra接口?

如果要编写轻量级的JUnit测试&#xff0c; Mockito是我最喜欢的小帮手。 如有必要&#xff0c;可以通过模拟轻松地替换被测单元的“实际”依赖关系&#xff0c;这非常有用。 尤其是在处理框架API的边界线时&#xff0c;此类依赖项的设置否则可能非常昂贵。 但是有时候情况要复…

d9900 修改ip 思科dcm_思科设备SSH登陆详细配置过程

思科设备SSH登陆详细配置过程我们用GNS3进行拓扑搭建。实验拓扑图如下&#xff1a;进行完基本配置之后开始配置SSH服务器(R2)1.首先验证设备是否支持SSHR2#show ip ssh能够识别这条命令就说明支持。2.配置IP域名。使用config# ip domain-name domain-name全局配置模式命令配置网…

scrapy框架使用splash渲染引擎爬取动态页面

1.启动docker&#xff0c;在命令行里输入 docker run -p 8050:8050 scrapinghub/splash在docker上运行splash引擎 2.接下来就可以来写爬虫文件了 首先在setting里配置 splash_urlhttp://loaclhost:8050 DUPEFLITERscrapy_splash.SplashAwareDupeFilterDOWNLOADER_MIDDLEWARES …

Testing BlogJet

I have installed an interesting application - BlogJet. Its a cool Windows client for my blog tool (as well as for other tools). Get your copy here: http://blogjet.com"Computers are useless. They can only give you answers." -- Pablo Picasso转载于:…

async,await

function timeout(ms){return new Promise(function(resolve){setTimeout(resolve,ms)}) }async function asyncPrint(value,ms){await timeout(ms);console.log(value) } asyncPrint(hello world,5000) 这段代码是过了5秒再显示hello world await是要等待这句代码执行完&…

Homebrew是什么?怎么关闭自动更新?

Homebrew是MacOS 的软件包管理器。 通过它可以安装、卸载、更新、查看、搜索任何想要安装的软件。如&#xff1a;git, node等。 安装Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 查看Homebrew br…

C语言中case后面有空格吗,C语言中switch case语句可变参实现方法(case 参数 空格...空格 参数 :)...

正常情况下&#xff0c;switch case语句是这么写的&#xff1a;switch(参数){case1:...;break;case2:...;break;default:...break;}这种是我们最常见的写法&#xff0c;当然也可以这么写&#xff1a;switch(参数){case1:case2:case3:case4:...;break;default:...;break;}接下来…

java 把string转为keyevent_盘点现在Java强大第三方库(字符串操作),程序员都该知道!...

1.字符串与集合间的转化引用第三方库 Apache Commons Lang jre连接值得一提的自JDK1.8以后字符串集合转为字符串可以使用String类下的join()方法,但别的数据类型还是要依靠第三方库--对比JDK和第三库代码如下我自己是一名从事了多年开发的java老程序员&#xff0c;这段时间整理…

Redis安装文档

1.前置条件 前置条件&#xff1a;linux已经可以上网&#xff0c;参考&#xff1a;https://www.cnblogs.com/ZenoLiang/p/10201875.html 2.安装redis 2.1依赖包检查 1. yum install cpp -y 2. yum install binutils -y 3. yum install glibc-kernheaders -y 4. yum install…

JDK 8的启发性Javadoc

标准JDK 8 API文档的一个不错的功能之一就是能够查看所有或不同类别的方法&#xff0c;正如我在博客文章JDK 8 Javadoc Tweaked For Methods Listings中所讨论的那样。 尽管这种分类既方便又有用&#xff0c;但是与JDK 8中许多新类和程序包相关联的文本注释无疑更有用&#xff…

我用Mono(1)

我在Mono 0.1就开始关注和试用Mono了。我印象最深的一次是&#xff0c;我在FreeBSD里编译好了Mono&#xff08;FreeBSD装在VPC里&#xff09;。我用了同样的算法写了一个CS文件和JAVA文件。然后在虚拟机的FreeBSD的Mono下编译运行&#xff0c;把Java文件在真实机器的Windows XP…

setTimeout(fn,0)

我们都知道setTimeout是一个延迟执行的函数 console.log(1); setTimeout(function(){console.log(2);},1000); console.log(3); 会得到1&#xff0c;3&#xff0c;2 但是 setTimeout(function(){console.log(1);}, 0); console.log(2); 你知道这段代码会执行什么样的效果吗 正…

Java基本数据类型的传值

传递值&#xff1a; 说明&#xff1a;标题其实说法是错误的。Java中只有值传递&#xff0c;没有引用传递。 ... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x x *2; } ... ... //调用该函数 int num 5; System.out.println(num); change…

红楼梦人物分析系统c语言,Gephi分析红楼梦

前言上一周赶了好久的社会网络计算&#xff0c;貌似是第四周还是第五周的时候&#xff0c;那时候我们就把题目定下来了吧&#xff0c;然后一直拖着没有做。其中的原因多种多样 &#xff0c;其实也可以说没有什么原因&#xff0c;就是不想做而已&#xff0c;然后就假装忘记23333…

二、MyBatis-HelloWorld

环境准备 1.创建数据库表 create table tbl_employee (id int(11) primary key AUTO_INCREMENT comment "ID",last_name varchar(20) default null comment "姓名",email varchar(20) default null comment "邮件",gender varchar(1) default nu…

洪水同频率放大的方法_我们应该怎么选择放大器配件?

在市面上&#xff0c;手机信号放大器高达百种型号与品牌&#xff0c;每种手机信号放大器所需的配件也不相同&#xff0c;我们需要选择合适的配件&#xff0c;才能让手机信号放大器更稳定的运行。下面佛山红岸谷通讯教大家怎么选适合自己的手机信号放大器配件。主要有以下几点。…

Java代码风格:最终决定

所谓的最不起眼的事情如何导致争议性的讨论&#xff0c;有时甚至导致激烈的辩论激烈&#xff0c;这不是很有趣吗&#xff1f; 例如&#xff0c;我目睹了几次场合&#xff0c;如何使用关键字final引发了非常激烈的争论。 对于一个外部观察者来说&#xff0c;这看起来似乎是对邪恶…