java安全沙箱之內置的JAVA虛擬機,讀完之後,大部分程序員收藏了


java安全沙箱之內置的JAVA虛擬機,讀完之後,大部分程序員收藏了

簡介

jvm裝載一個類,並且對字節碼進行了四趟掃描,這些字節碼就能安全地被執行了。然而去了這些安全校驗,jvm在執行字節碼時還進行了一些內置的安全機制校驗。這些安全機制主要包括:

  • 內存自動分配
  • 自動拉機回收機制
  • 數組邊界檢查
  • 空指針檢查
  • 異常處理機制

內存自動分配

在編寫java程序時幾乎不能直接分配內存,比如當new一個對象時,jvm會在堆中自動幫程序分配好內存,當在方法中申明一個引用或常量時,jvm則會在棧上自動分配好內存;不能直接分配內存能夠控制程序不小心或者惡意地覆蓋一些重要地內存數據。注意,前面說“幾乎不能”是因為可以通過反射調用sun.misc.Unsafe的方法是可以操作指定位置的內存(當然也是有限制的);還有一種方法可以破壞內存自動分配,那就是調用jni,對於本地方法,java安全機制完全不起作用,當一個線程執行本地方法時,它就跳出了java的安全沙箱;jni是為了擴展性而犧牲了一些安全性。

自動垃圾回收機制

自動垃圾回收機制是java的一個重要特性,它的主要作用是為了防止內存洩漏,也是一種安全機制。一些沒有自動垃圾回收的語言比如C++經常出現的問題是忘了調用對象的析構函數而造成內存洩漏。然而java的自動垃圾回收機制並不代表程序員不用關心內存洩漏問題了,因為內存的自動垃圾回收是需要特定條件的(無引用);自動垃圾回收機制是一個很長的話題,想要詳細瞭解的話推薦參考《Java性能優化權威指南》的第三章。

數組邊界檢查

數組邊界檢查也是一種控制內存訪問的安全機制,對於其它沒有數組邊界檢查的語言比如C語言,很常見的一種攻擊手法是“緩衝區溢出攻擊”,比如程序中定義了個長度為16的數組,如果沒有數組邊界異常,有漏洞或者惡意的程序可能會讀取或操作下標為100的內存,而該內存如果存儲了重要數據,就可能被讀取或者被篡改,從而引發安全問題。

空指針檢查

空指針檢查是為了防止程序出現不可預期的結果,調用空對象的方法或者字段時會拋出java.lang.NullPointerException,這是一種非受查異常。假如程序出現空指針使用的情況,很大的可能是因為程序員的粗心導致的,如果不通過拋出異常中斷程序,可能會導致不可預期的結果,比如程序員以為執行了某個對象的某個方法,但是因為使用了空對象卻沒有執行。

異常處理機制

最後一種安全機制就是java的異常處理,java的異常處理是基於線程的,而不是基於進程的,這樣就保證了異常處理是輕量級的,如果一個線程出現了異常,java會沿著該線程的方法調用棧一直往上層拋異常,直到異常被處理,如果每層方法棧都沒有處理該異常的話就會終止該線程,而此時如果還存在非守護線程的話就不會終止jvm進程;這樣就不會影響其它正確執行的線程了。

關注

感謝閱讀,如果這篇文章幫助了您,歡迎 點贊收藏,關注轉發 喲。您的幫助是我們前行的動力,我們會提供更多有價值的內容給大家... 謝謝!


分享到:


相關文章: