内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败
生活随笔
收集整理的這篇文章主要介紹了
内存映射文件 写入 卡住_在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)
結論:內存映射文件很棒–就像一把鋒利的刀子一樣很棒:您可以非??焖俚厥褂盟鼈儊碜龃笫?#xff0c;但是它們也可以使您不勝其煩。 如果由于其優點而要使用內存映射文件,則它們具有以下優點:
- 準備崩潰。 制定一個計劃何時發生(熱備用,熱備用,什么都不做–這些都是有效的選項,但要事先決定)
- 如果要確保數據在磁盤上,請刷新它 。 當返回時,您可以(幾乎)確定數據在磁盤上(我們不會在這里進入磁盤/控制器高速緩存或虛擬服務器的奇妙世界)。
翻譯自: https://www.javacodegeeks.com/2014/03/detecting-write-failures-when-using-memory-mapped-files-in-java.html
內存映射文件 寫入 卡住
總結
以上是生活随笔為你收集整理的内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑开机自动启动的软件怎么关闭电脑开机程
- 下一篇: 每个Java开发人员都应该知道的10个基