使不安全变得更加安全
總覽
如果直接使用Unsafe,則可能會(huì)導(dǎo)致JVM崩潰。 當(dāng)您訪問(wèn)尚未映射的內(nèi)存頁(yè)面并且在Unix上的結(jié)果是SIGSEG(如果您訪問(wèn)頁(yè)面0)或SIGBUS(如果您訪問(wèn)另一個(gè)未映射的頁(yè)面)時(shí),就會(huì)發(fā)生這種情況。
使用MethodHandles
用MethodHandle包裝不安全的方法是可能的解決方案。 您可以將代碼添加到“方法句柄”以檢查零頁(yè)面訪問(wèn)。 例如unsigned_ptr <4096。您應(yīng)該將其添加到MethodHandle的原因是,它可以使優(yōu)化檢查變得更容易。
缺點(diǎn)是
- 您必須使用MethodHandles,它會(huì)使語(yǔ)法復(fù)雜化,并掩蓋您的實(shí)際工作。
- 如果你不這樣做是行不通的
- 它不涵蓋總線錯(cuò)誤,也不涵蓋總線錯(cuò)誤,因?yàn)檎麄€(gè)應(yīng)用程序的映射很復(fù)雜,并且可以隨時(shí)在任何線程中更改。
- 優(yōu)化邊界檢查需要優(yōu)化器進(jìn)行一些工作,這有待證明。
使用信號(hào)
如果已經(jīng)有某種方法可以在硬件中做到這一點(diǎn),那就可以了。 CPU已檢查您嘗試訪問(wèn)的頁(yè)面是否有效,如果該頁(yè)面不在緩存中,它將引發(fā)中斷。 如果操作系統(tǒng)無(wú)法找到/創(chuàng)建此高速緩存未命中的映射,則此中斷將變?yōu)樾盘?hào)。
如果JVM中已經(jīng)只有一個(gè)信號(hào)處理程序,并且確實(shí)存在,那就是產(chǎn)生崩潰報(bào)告的原因。
如果只有某種方式,中斷處理程序可以將錯(cuò)誤或異常觸發(fā)回觸發(fā)它的代碼。 就像Thread.currentThread()。stop(e); (你明白了)
優(yōu)點(diǎn)
- 由于CPU已經(jīng)完成了檢查,因此不需要其他工作。
- 對(duì)優(yōu)化器的最小更改(如果有)。
- 可能適用于從各種來(lái)源產(chǎn)生的信號(hào)。
- 使用信號(hào)是捕獲Java之前的運(yùn)行時(shí)錯(cuò)誤的成熟/舊技術(shù)方法。
缺點(diǎn)
- 單一處理可能是一個(gè)停下來(lái)的操作(當(dāng)前無(wú)法在Java中對(duì)其進(jìn)行基準(zhǔn)測(cè)試)
- 即使不是,觸發(fā)錯(cuò)誤時(shí)它的成本也可能更高。
- 您將不得不更改傳統(tǒng)上未更改的信號(hào)處理程序。 即,有更多的經(jīng)驗(yàn)來(lái)改變優(yōu)化器。
可能引發(fā)的異常
可能會(huì)引發(fā)新的異常,但是我建議重用現(xiàn)有的異常。
訪問(wèn)頁(yè)面0 – NullPointerException
訪問(wèn)頁(yè)面0(不僅僅是訪問(wèn)NULL指針)將觸發(fā)SIGSEG。 NPE是根據(jù)C對(duì)NULL指針的訪問(wèn)來(lái)命名的,與訪問(wèn)引用相比,使用NPE訪問(wèn)NULL指針可能更明顯。 也就是說(shuō),由于Java沒(méi)有指針,它可能被稱為NullReferenceException。
無(wú)效的訪問(wèn)– IndexOutOfBoundsException
其他候選對(duì)象包括BufferUnderflowException(如果您的頁(yè)面缺少映射區(qū)域),BufferOverflowException(如果您的頁(yè)面沒(méi)有映射區(qū)域)。
這些都是它們的共同點(diǎn)是它們是RuntimeException(s)。 如果引發(fā)了一個(gè)自定義的,更具描述性的異常,則RuntimeException可能與拋出的現(xiàn)有throwables一致。
結(jié)論
使性能最大化的常見(jiàn)技巧是: 不要用Java編寫(xiě)系統(tǒng)已經(jīng)為您完成的事情。 在Chronicle中,我們使用OS對(duì)磁盤(pán)進(jìn)行異步持久化,并且比再次用Java編寫(xiě)持久化磁盤(pán)更高效,更可靠。 同樣,如果重新使用CPU和OS提供的功能,則捕獲和處理無(wú)效的內(nèi)存訪問(wèn)將更有效,更可靠。
一般來(lái)說(shuō),當(dāng)每個(gè)操作系統(tǒng)做不同的事情以支持跨平臺(tái)兼容性時(shí),您都將重新編寫(xiě)操作系統(tǒng)功能,但是這樣做僅需最低要求。 這就是為什么Java沒(méi)有線程調(diào)度程序,并且相對(duì)而言,它幾乎無(wú)法控制線程的運(yùn)行方式。
虛擬內(nèi)存處理非常古老且標(biāo)準(zhǔn),以至于主要平臺(tái)的工作方式基本相同。
翻譯自: https://www.javacodegeeks.com/2014/06/making-unsafe-safer.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的使不安全变得更加安全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么解决ddos攻击(快速解决DDOS攻
- 下一篇: linuxone(linux %o)