内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败

内存映射文件 写入 卡住

内存映射文件是一个很好的并且经常被忽视的工具。 我不会在这里详细介绍它们的工作方式(使用 Google Luke!),但我将快速总结其优势:

  • 操作系统提供的延迟加载和写入缓存(您不必自己编写,并且可以确信操作系统的性能良好)
  • 易于读取复杂的二进制数据(例如其中编码有各种相对偏移量的二进制数据)
  • 可用作高性能IPC机制
  • 即使您的进程崩溃(如果操作系统仍然存在)也可以写入磁盘
  • 因为不阻塞(操作系统提供了异步刷新)并且不需要进入内核模式,所以写入速度非常快

但是,由于所有这些异步性,我感到纳闷:如果发生磁盘故障,会发生什么? 操作系统如何通知您的进程它无法将写入的内容写入磁盘?

一点点搜索就找到了答案:

  • 在Linux下,当操作系统尝试将内存写回到磁盘但失败时, 您的进程将获得SIGBUS 。
  • 在Windows下,您下次尝试在文件句柄上调用OS函数时,会收到EXCEPTION_IN_PAGE_ERROR错误

为了确认信息,我提出了一个快速测试程序 ,将一个牺牲USB驱动器插入笔记本电脑并进行了一些测试。 结论是:

  • 当然,Linux会生成SIGBUS,并且Java(OpenJDK 1.7.0_51-b00)没有针对它的处理程序,从而导致进程崩溃:
    # A fatal error has been detected by the Java Runtime Environment:
    #
    #  SIGBUS (0x7) at pc=0x00007f9bb5042396, pid=26654, tid=140306951444224
    #
    # JRE version: OpenJDK Runtime Environment (7.0_51) (build 1.7.0_51-b00)
    # Java VM: OpenJDK 64-Bit Server VM (24.45-b08 mixed mode linux-amd64 compressed oops)
    # Problematic frame:
    # v  ~StubRoutines::jlong_disjoint_arraycopy

    从好的方面来说,您知道自从您的流程停止以来,出现了严重错误。 不利的一面是,您可能不会立即采取行动(除非您已经阅读了这篇文章)

  • 如果您尝试刷新文件,Linux也可以生成更多“传统”错误情况,例如:
    Exception in thread "main" java.io.IOException: Input/output errorat sun.nio.ch.FileDispatcherImpl.force0(Native Method)at sun.nio.ch.FileDispatcherImpl.force(FileDispatcherImpl.java:76)at sun.nio.ch.FileChannelImpl.force(FileChannelImpl.java:376)at Main.main(Main.java:84)
  • Windows仅在再次对文件句柄进行操作时才会生成异常(例如,像在Linux中那样将其分散化,但是在创建新映射时(在Linux中则没有这种体验)):
    Exception in thread "main" java.io.IOException: The volume for a file has been externally altered so that the opened file is no longer validat sun.nio.ch.FileDispatcherImpl.size0(Native Method)at sun.nio.ch.FileDispatcherImpl.size(FileDispatcherImpl.java:96)at sun.nio.ch.FileChannelImpl.size(FileChannelImpl.java:307)at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:849)at Main.main(Main.java:64)

结论:内存映射文件很棒–就像一把锋利的刀子一样很棒:您可以非常快速地使用它们来做大事,但是它们也可以使您不胜其烦。 如果由于其优点而要使用内存映射文件,则它们具有以下优点:

  • 准备崩溃。 制定一个计划何时发生(热备用,热备用,什么都不做–这些都是有效的选项,但要事先决定)
  • 如果要确保数据在磁盘上,请刷新它 。 当返回时,您可以(几乎)确定数据在磁盘上(我们不会在这里进入磁盘/控制器高速缓存或虚拟服务器的奇妙世界)。

参考: Transylvania JUG博客上的JCG合作伙伴 Attila Mihaly Balazs 在Java中使用内存映射文件时检测(写入)失败 。

翻译自: https://www.javacodegeeks.com/2014/03/detecting-write-failures-when-using-memory-mapped-files-in-java.html

内存映射文件 写入 卡住

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

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

相关文章

飞畅科技——视频光端机用光模块的选型详解

光模块的出现简化了数字视频光端机的设计,我们只要把光模块当作一个具有光电转换功能的部件就可以了。那么针对各种不同的光端机,应该怎样选择相应的光模块呢?接下来就由飞畅科技的小编来为大家详细介绍下视频光端机用光模块的选型&#xff0…

视频监控中的光端机是干什么用的?

现如今,随着社会的进步和经济的发展,人民生活开始富裕,经济宽裕的家庭用户已开始考虑使用监控产品来保护自己,监控已经呈现融入家庭生活的趋势。就数字监控而言,虽然是后起之秀,但依然是现阶段发展趋势。光…

每个Java开发人员都应该知道的10个基本工具

大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经为2019年的学习目标以及如何实现这些目标制定了目标。 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改进以成为2019年更好的全方位开发人员,例…

java怎么使异常不起作用_java – @Test(expected = Exception.class)对我不起作用,我错过了什么?...

我正在使用sts,但也在命令行上使用mvn clean install.我创建了这个简单的测试作为例子.import org.junit.Test;import junit.framework.TestCase;public class QuickTest extends TestCase {Test(expected Exception.class)public void test() {throwsException();}private vo…

数字非压缩光端机的选购原则

数字非压缩光端机主要应用于高速公路监控领域,可以保证实时性,指的是不经过压缩进行光传输的光端机,是在非压缩光端机基础上利用ADM电分插复用与TDM时分复用技术在一根光纤中实现多点多路(最大16个视频点)视频传播的光…

spring集成jndi_Spring应用程序与JNDI连接池的集成测试

spring集成jndi我们都知道,无论何时连接到数据库,都需要使用连接池。 所有使用JDBC 4类的现代驱动程序都支持它。 在本文中,我们将概述Spring应用程序中的连接池,以及如何在非JEE环境(例如测试)中处理相同的…

java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...

访问权限Java 中有三个访问权限修饰符:private、protected 以及 public,如果不加访问修饰符,表示包级可见。可以对类或类中的成员(字段和方法)加上访问修饰符。类可见表示其它类可以用这个类创建实例对象。成员可见表示其它类可以用这个类的实…

【渝粤教育】21秋期末考试管理会计10171k2

1、下列项目中,变动成本法下计入产品成本的是( )。 (2 分) A.变动性制造费用 B.变动性管理费用 C.固定性管理费用 D.固定性制造费用 2、将成本中心划分为标准成本中心和费用中心的分类依据是&am…

数字光端机和模拟视频光端机的六个不同点

说到模拟视频光端机与数字光端机的不同之处,在这里飞畅科技的小编要介绍六点不一样的地方来详细讲解模拟视频光端机与数字光端机的不同。模拟视频光端机与数字光端机究竟有何区别,这也是众多用户所关心的确问题,本文从以下几个方面进行如下论…

在硒中按TagName定位元素

硒定位器是处理网页上的元素时的关键。 从ID,名称,类,标记名,XPath,CSS选择器等定位器列表中,可以根据需要选择其中任何一种,然后在网页上找到Web元素。 由于与tagName或linktext相比&#xff0…

java输出链表的值_[剑指offer] 从尾到头打印链表(三种方法) java

一、每次把新遍历的链表值放到list索引为0的位置&#xff0c;实现逆序。public class Solution {public ArrayList printListFromTailToHead(ListNode listNode) {ArrayList listnew ArrayList<>();if(listNodenull) return list;while(listNode!null){list.add(0,listNo…

工业级以太网交换机-管理型

工业以太网交换机&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;由于采用的网络标准&#xff0c;其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议&#xff0c;以太网已经成为工业控制领域的主要通信标准。那么&#xff0c;管理型工业级以…

【渝粤教育】国家开放大学2018年春季 0064-22T20世纪欧美文学 参考试题

试卷代号&#xff1a;0064 2017-2018学年第二学期期末考试 外国文学专题试题 2018年7月 一、填空题&#xff08;每空3分&#xff0c;共30分&#xff09; 1. 是作家又是政治活动家&#xff0c;曾多次来到中国。他著有两部描写中国工人罢工和起义的作品&…

jdk 1.8 jdk8_JDK 8功能的可疑方面

jdk 1.8 jdk8我们大多数使用Java进行开发的人通常都热衷于JDK 8附带的功能和改进。 但是&#xff0c;最近有几篇文章指出了某些功能可能会被滥用和滥用&#xff0c;并可能在将来导致一些其他问题。 这些功能使我想起了J2SE 5中引入的自动装箱功能&#xff0c;虽然有其有用的情况…

Java注解参数类型枚举值_EffectiveJava-5-枚举和注解

用enum代替int常量1. int枚举&#xff1a;引入枚举前&#xff0c;一般是声明一组具名的int常量&#xff0c;每个常量代表一个类型成员&#xff0c;这种方法叫做int枚举模式。int枚举模式是类型不安全的&#xff0c;例如下面两组常量&#xff1a;性别和动物种类&#xff0c;二者…

【渝粤教育】国家开放大学2018年春季 0149-21T现代汉语 参考试题

试卷编号&#xff1a;0149 座位号 2017——2018学年度第二学期期末考试 现代汉语试题 2018年7月 1.合口呼韵母2&#xff0e;合成词 3&#xff0e;同义词4&#xff0e;非成词语素 5&#xff0e;派生义 1&#xff0e;有两种趋势促进了现代汉民族共同语的发展&#xff0c;一是 …

JDK 12 – JEP 325开关表达式

JDK 12于2019年3月19 日上线GA&#xff0c;继续致力于缩短发布周期和频繁发布。 该版本的功能部分可以在这里找到。 对于开发人员来说&#xff0c;有趣的功能之一是“ JEP 325开关表达式 ”&#xff0c;它可以作为预览功能使用。 此处定义的预览功能是&#xff1a; 预览语言或…

【渝粤教育】国家开放大学2018年春季 0222-22T模拟电子电路 参考试题

编号&#xff1a;0222 b 2017-2018年度第二学期期末考试 模拟电子电路&#xff08;开卷&#xff09; 试 题 2018年 7 月 一 、概念解释&#xff08;每小题6分&#xff0c;共30分&#xff09;1、电流放大倍数2、自激振荡3、负反馈4、通频带5、滤波二、放大电路的计算&#xff0…

工业交换机:如果出现了物理性故障该怎么判断?

一般工业交换机出现故障大致可以分为&#xff1a;软性能故障和物理性故障。软性能故障一般是指工业交换机在研发设计方面出现的问题。今天就由飞畅科技的小编来给大家聊聊工业交换机物理性故障该怎么判断&#xff1f;一起来看看吧&#xff01; 物理层故障主要是指交换机本身的…

java example cat_java maven hello example

Maven插件开发From:Maven 插件开发—-让maven使用更加灵活对于习惯于使用maven构建、管理项目的人来说&#xff0c;maven就是项目开发、测试、部署的一把利器&#xff1a;对类库的集中管理&#xff1b;依赖传递、继承、重用性高&#xff1b;对整个项目开发生命周期的完整支持&a…