2011-10-06 41 views
1

我知道可以通過在jvm中使用Unsafe類來直接寫入和讀取內存。在java中使用Unsafe寫入/讀取內存

除此之外,這確實是不安全的,並且有些適得其反,我反而想知道是誰/負責檢查允許的內存位置的邊界。 而且如果有一些機制可以保護已經分配的內存被覆蓋。 與這個最新的問題相關,可以通過覆蓋他不應該做什麼的可能的損害?那麼,這可以被最好地改寫爲:可以寫什麼類型的內存,或者已經存儲了哪些類型的信息?

感謝

回答

2

底層操作系統將確保你不會分配給應用程序的內存之外寫(它可以很容易做到,因爲Virtual Memory)。如果你這樣做,你會得到一個分段錯誤或類似的錯誤除此之外,JVM可能會做自己的綁定檢查。你絕對不會被允許寫任何明智的(即其他應用程序)內存,我懷疑JVM會允許你覆蓋內部結構,但我可能在那裏寫錯了。因此,總結一下你的問題的答案:在你不應該的地方覆蓋的可能的損害是在最好的情況下你的應用程序出現故障,最壞的情況是JVM崩潰。

關於安全措施,不使用不安全將是一個很好的...除此之外,你當然可以在你的應用程序代碼沒有分配的內存中寫入你自己的內存分配器寫入它不應該的區域。

因此,最後一個問題的答案是,如果JVM允許您訪問分配的不安全區域之外的內存,則可以訪問的信息和內存類型是任何對象以及任何內部JVM結構體。顯然,改變這些會造成嚴重破壞,所以很可能試圖這樣做會導致崩潰。

2

通過使用Unsafe類,負責檢查允許的內存位置的邊界。

你不應該認爲會有一些機制阻止你破壞你不應該觸及的進程內存部分。

的伴隨Unsafe.getUnsafe()comment是相當清楚的:

[所述Unsafe實例]可用於在任意 存儲器地址來讀取和寫入數據。

+0

因此,我可以寫入任何區域並崩潰整個操作系統? – Leonardo

+0

@Leonardo:不,根據我的回答,你可以破壞**你的進程內存**。一半體面的操作系統將阻止你影響其他進程。 – NPE