内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败
內(nèi)存映射文件 寫入 卡住
內(nèi)存映射文件是一個(gè)很好的并且經(jīng)常被忽視的工具。 我不會(huì)在這里詳細(xì)介紹它們的工作方式(使用 力 Google Luke!),但我將快速總結(jié)其優(yōu)勢(shì):
- 操作系統(tǒng)提供的延遲加載和寫入緩存(您不必自己編寫,并且可以確信操作系統(tǒng)的性能良好)
- 易于讀取復(fù)雜的二進(jìn)制數(shù)據(jù)(例如其中編碼有各種相對(duì)偏移量的二進(jìn)制數(shù)據(jù))
- 可用作高性能IPC機(jī)制
- 即使您的進(jìn)程崩潰(如果操作系統(tǒng)仍然存在)也可以寫入磁盤
- 因?yàn)椴蛔枞?#xff08;操作系統(tǒng)提供了異步刷新)并且不需要進(jìn)入內(nèi)核模式,所以寫入速度非常快
但是,由于所有這些異步性,我感到納悶:如果發(fā)生磁盤故障,會(huì)發(fā)生什么? 操作系統(tǒng)如何通知您的進(jìn)程它無法將寫入的內(nèi)容寫入磁盤?
一點(diǎn)點(diǎn)搜索就找到了答案:
- 在Linux下,當(dāng)操作系統(tǒng)嘗試將內(nèi)存寫回到磁盤但失敗時(shí), 您的進(jìn)程將獲得SIGBUS 。
- 在Windows下,您下次嘗試在文件句柄上調(diào)用OS函數(shù)時(shí),會(huì)收到EXCEPTION_IN_PAGE_ERROR錯(cuò)誤
為了確認(rèn)信息,我提出了一個(gè)快速測(cè)試程序 ,將一個(gè)犧牲USB驅(qū)動(dòng)器插入筆記本電腦并進(jìn)行了一些測(cè)試。 結(jié)論是:
- 當(dāng)然,Linux會(huì)生成SIGBUS,并且Java(OpenJDK 1.7.0_51-b00)沒有針對(duì)它的處理程序,從而導(dǎo)致進(jìn)程崩潰: # 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
從好的方面來說,您知道自從您的流程停止以來,出現(xiàn)了嚴(yán)重錯(cuò)誤。 不利的一面是,您可能不會(huì)立即采取行動(dòng)(除非您已經(jīng)閱讀了這篇文章)
- 如果您嘗試刷新文件,Linux也可以生成更多“傳統(tǒng)”錯(cuò)誤情況,例如: 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僅在再次對(duì)文件句柄進(jìn)行操作時(shí)才會(huì)生成異常(例如,像在Linux中那樣將其分散化,但是在創(chuàng)建新映射時(shí)(在Linux中則沒有這種體驗(yàn))): 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)
結(jié)論:內(nèi)存映射文件很棒–就像一把鋒利的刀子一樣很棒:您可以非常快速地使用它們來做大事,但是它們也可以使您不勝其煩。 如果由于其優(yōu)點(diǎn)而要使用內(nèi)存映射文件,則它們具有以下優(yōu)點(diǎn):
- 準(zhǔn)備崩潰。 制定一個(gè)計(jì)劃何時(shí)發(fā)生(熱備用,熱備用,什么都不做–這些都是有效的選項(xiàng),但要事先決定)
- 如果要確保數(shù)據(jù)在磁盤上,請(qǐng)刷新它 。 當(dāng)返回時(shí),您可以(幾乎)確定數(shù)據(jù)在磁盤上(我們不會(huì)在這里進(jìn)入磁盤/控制器高速緩存或虛擬服務(wù)器的奇妙世界)。
翻譯自: https://www.javacodegeeks.com/2014/03/detecting-write-failures-when-using-memory-mapped-files-in-java.html
內(nèi)存映射文件 寫入 卡住
總結(jié)
以上是生活随笔為你收集整理的内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑开机自动启动的软件怎么关闭电脑开机程
- 下一篇: 每个Java开发人员都应该知道的10个基