java是一種類型安全的語言,它有四類稱爲安全沙箱機制的安全機制來保證語言的安全性,這四類安全沙箱分別是:
java
類加載體系程序員
內置於Java虛擬機(及語言)的安全特性安全
安全管理器及Java API性能優化
本篇博客主要介紹「內置於Java虛擬機(及語言)的安全特性」的基本原理;如需瞭解其它幾類安全機制能夠經過上面的博客連接進入查看。jvm
jvm裝載一個類,而且對字節碼進行了四趟掃描,這些字節碼就能安全地被執行了。然而去了這些安全校驗,jvm在執行字節碼時還進行了一些內置的安全機制校驗。這些安全機制主要包括:函數
內存自動分配性能
自動拉機回收機制優化
數組邊界檢查ui
空指針檢查
異常處理機制
在編寫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進程;這樣就不會影響其它正確執行的線程了。