总览

如果直接使用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

使不安全变得更加安全相关推荐

  1. 怎样让手机变得更安全_使不安全变得更加安全

    怎样让手机变得更安全 总览 如果直接使用Unsafe,则可能会导致JVM崩溃. 当您访问尚未映射的内存页面并且在Unix上的结果是SIGSEG(如果您访问页面0)或SIGBUS(如果您访问另一个未映射 ...

  2. 怎样使set现程变得安全_使不安全变得更加安全

    怎样使set现程变得安全 总览 如果直接使用Unsafe,则可能会导致JVM崩溃. 当您访问尚未映射的内存页面并且在Unix上的结果是SIGSEG(如果访问页面0)或SIGBUS(如果您访问另一个未映 ...

  3. 公司java框架让程序员变笨_框架会使程序员变笨吗?

     提示:点击上方"CocoaChina"↑免费订阅 上周,我做了几次面试,要招几名有5年工作经验的高级Java开发人员.但当面试结束后,我感觉到,各种框架(frameworks ...

  4. 框架会使程序员变笨吗?

    为什么80%的码农都做不了架构师?>>>    上周,我做了几次面试,要招几名有5年工作经验的高级Java开发人员.但当面试结束后,我感觉到,各种框架(frameworks)使开发变 ...

  5. mac移动鼠标光标会变大_如何在Mac上使鼠标光标变大或变小

    mac移动鼠标光标会变大 The macOS cursor isn't tiny, but some people have trouble seeing it. If you're one of t ...

  6. 前端页面添加灰色滤镜,使网页整体变灰

    前端页面添加灰色滤镜,使网页整体变灰 修改css样式 只需要在html的样式里面加一句代码 html,body,div,img{-webkit-filter: grayscale(100%);-moz ...

  7. html一键使网页字体变大,网页字体变大了怎么办

    网页字体变大了导致重叠怎么办?不是缩放的原因 我的电脑网页字体变大了怎么办 按住CTRL在滚动鼠标滚轮...或者在网页右下角有个调整的,,百分之多少的..或者CTRL+ 或者CTRL- 都可以调整 原 ...

  8. 屏幕显示密度dpi_华为mate7——修改 DPI 屏幕密度 !可使屏幕在视觉上变得更大...

    本帖最后由 丶浩南丶 于 2015-6-5 18:36 编辑 7eed1eeb1ec25a2f7c2eba32caac659a8147.jpg (99.56 KB, 下载次数: 106) 2015-6 ...

  9. 你真的会用iPad吗,如何使iPad秒变生产力工具?在iPad上用vscode写代码搞开发

    目录 前言 视频教程 1. 本地环境配置 2. 内网穿透 2.1 安装cpolar内网穿透(支持一键自动安装脚本) 2.2 创建HTTP隧道 3. 测试远程访问 4. 配置固定二级子域名 4.1 保留 ...

最新文章

  1. cocos v3.10 下载地址
  2. UA MATH567 高维统计II 随机向量8 图的max-cut问题 0.5近似算法
  3. 使用Spring Security对RESTful服务进行身份验证
  4. 计算机原理语言方框图,计算机原理整理原版1.10.docx
  5. visual studio (vs)常用快捷键
  6. 【转】.Net 架构图
  7. Verilog 任意分频器设计
  8. python项目源码和注解_python源代码和注释 - 随笔分类 - 秦朗的天空 - 博客园
  9. 服务器装系统提示未找到任何驱动器,win7系统安装时提示找不到任何设备驱动程序的四种解决方法图文教程...
  10. 如何将音乐复制到您的Android手机
  11. dede搜索结果页列表标题长度修改方法
  12. Vivado软件的使用
  13. (ssl1960)2009年东莞市信息学特长生测试题 开发区规划
  14. python合并ts视频(三种方法)
  15. Spearman’s correlation coefficient--斯皮尔曼相关系数pytorch与numpy实现
  16. 你给我的感悟,我读懂了文字
  17. 怎么用账号登陆公司服务器地址,大企业邮箱登录入口,如何在foxmail上设置企业邮箱账号?...
  18. 海思3520Dv300和NVP6124B摄像头自适应
  19. python儿童编程例子代码-认识Python
  20. 使用ebpf 监控mysqld 内核

热门文章

  1. 2014年JAVA省赛B组---第四题---大衍数列
  2. JavaWeb前端之AJAX的初步学习
  3. 用IDEA把SpringBoot项目打成jar发布项目 不要用 在上面有可以用的
  4. 常用的数据交换格式有哪些_高程数据格式介绍
  5. 算法运行时间中的对数
  6. lambda层保存模型出错_保存您的lambda,以备不时之需-保存到文件
  7. javafx如何带菜单_JavaFX技巧30:带有DropShadow的ScrollPane
  8. io流,装饰者模式_流与装饰器
  9. vue.jsr入门_JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性
  10. netbeans ide_IDE:5个最喜欢的NetBeans功能