使不安全变得更加安全
总览
如果直接使用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
使不安全变得更加安全相关推荐
- 怎样让手机变得更安全_使不安全变得更加安全
怎样让手机变得更安全 总览 如果直接使用Unsafe,则可能会导致JVM崩溃. 当您访问尚未映射的内存页面并且在Unix上的结果是SIGSEG(如果您访问页面0)或SIGBUS(如果您访问另一个未映射 ...
- 怎样使set现程变得安全_使不安全变得更加安全
怎样使set现程变得安全 总览 如果直接使用Unsafe,则可能会导致JVM崩溃. 当您访问尚未映射的内存页面并且在Unix上的结果是SIGSEG(如果访问页面0)或SIGBUS(如果您访问另一个未映 ...
- 公司java框架让程序员变笨_框架会使程序员变笨吗?
提示:点击上方"CocoaChina"↑免费订阅 上周,我做了几次面试,要招几名有5年工作经验的高级Java开发人员.但当面试结束后,我感觉到,各种框架(frameworks ...
- 框架会使程序员变笨吗?
为什么80%的码农都做不了架构师?>>> 上周,我做了几次面试,要招几名有5年工作经验的高级Java开发人员.但当面试结束后,我感觉到,各种框架(frameworks)使开发变 ...
- mac移动鼠标光标会变大_如何在Mac上使鼠标光标变大或变小
mac移动鼠标光标会变大 The macOS cursor isn't tiny, but some people have trouble seeing it. If you're one of t ...
- 前端页面添加灰色滤镜,使网页整体变灰
前端页面添加灰色滤镜,使网页整体变灰 修改css样式 只需要在html的样式里面加一句代码 html,body,div,img{-webkit-filter: grayscale(100%);-moz ...
- html一键使网页字体变大,网页字体变大了怎么办
网页字体变大了导致重叠怎么办?不是缩放的原因 我的电脑网页字体变大了怎么办 按住CTRL在滚动鼠标滚轮...或者在网页右下角有个调整的,,百分之多少的..或者CTRL+ 或者CTRL- 都可以调整 原 ...
- 屏幕显示密度dpi_华为mate7——修改 DPI 屏幕密度 !可使屏幕在视觉上变得更大...
本帖最后由 丶浩南丶 于 2015-6-5 18:36 编辑 7eed1eeb1ec25a2f7c2eba32caac659a8147.jpg (99.56 KB, 下载次数: 106) 2015-6 ...
- 你真的会用iPad吗,如何使iPad秒变生产力工具?在iPad上用vscode写代码搞开发
目录 前言 视频教程 1. 本地环境配置 2. 内网穿透 2.1 安装cpolar内网穿透(支持一键自动安装脚本) 2.2 创建HTTP隧道 3. 测试远程访问 4. 配置固定二级子域名 4.1 保留 ...
最新文章
- cocos v3.10 下载地址
- UA MATH567 高维统计II 随机向量8 图的max-cut问题 0.5近似算法
- 使用Spring Security对RESTful服务进行身份验证
- 计算机原理语言方框图,计算机原理整理原版1.10.docx
- visual studio (vs)常用快捷键
- 【转】.Net 架构图
- Verilog 任意分频器设计
- python项目源码和注解_python源代码和注释 - 随笔分类 - 秦朗的天空 - 博客园
- 服务器装系统提示未找到任何驱动器,win7系统安装时提示找不到任何设备驱动程序的四种解决方法图文教程...
- 如何将音乐复制到您的Android手机
- dede搜索结果页列表标题长度修改方法
- Vivado软件的使用
- (ssl1960)2009年东莞市信息学特长生测试题 开发区规划
- python合并ts视频(三种方法)
- Spearman’s correlation coefficient--斯皮尔曼相关系数pytorch与numpy实现
- 你给我的感悟,我读懂了文字
- 怎么用账号登陆公司服务器地址,大企业邮箱登录入口,如何在foxmail上设置企业邮箱账号?...
- 海思3520Dv300和NVP6124B摄像头自适应
- python儿童编程例子代码-认识Python
- 使用ebpf 监控mysqld 内核
热门文章
- 2014年JAVA省赛B组---第四题---大衍数列
- JavaWeb前端之AJAX的初步学习
- 用IDEA把SpringBoot项目打成jar发布项目 不要用 在上面有可以用的
- 常用的数据交换格式有哪些_高程数据格式介绍
- 算法运行时间中的对数
- lambda层保存模型出错_保存您的lambda,以备不时之需-保存到文件
- javafx如何带菜单_JavaFX技巧30:带有DropShadow的ScrollPane
- io流,装饰者模式_流与装饰器
- vue.jsr入门_JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性
- netbeans ide_IDE:5个最喜欢的NetBeans功能