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进程;这样就不会影响其它正确执行的线程了。