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

java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性的更多相关文章

  1. Java基础:三步学会Java Socket编程

    Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛        第一步 ...

  2. java 数据结构(三):java常用类 三 日期时间API

    JDK 8之前日期时间API 1.获取系统当前时间:System类中的currentTimeMillis()long time = System.currentTimeMillis();//返回当前时 ...

  3. 学习java随笔第三篇:java的基本数据类型

    数据类型 一:整型 1.十进制 2.八进制 八进制数是满8进1,包含0~7的8个数字,在整数前面添加一个"0",表示是八进制数. 3.十六进制 十六进制数是满16进1,包含0~9, ...

  4. Java从零开始学三十八(JAVA IO- 重定向IO)

    一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重 ...

  5. Java从零开始学三十六(JAVA IO- 字符流)

    一.字符流 BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中 BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的 ...

  6. Java从零开始学三十五(JAVA IO- 字节流)

    一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test ...

  7. Java从零开始学三十三四(JAVA IO-流简述)

    一.流概念(stream) File类并不能对文件内容进行读写. 读文件就是指:把文件的内中的数据读取到内存中来 写文件就是指:把内存中的数据写入到文件中去. 通过什么读写文件呢?文件流. 1.1.流 ...

  8. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

    Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...

  9. java 基础(三) 搭建Java编译环境(树莓派)

    安装需求1.JDK的安装2.PI4J的安装 JDK的安装1.首先到JDK的官网:https://www.oracle.com/technetwork/java/javase/downloads/ind ...

随机推荐

  1. C++ STL--stack/queue 的使用方法

    1.stack stack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类 ...

  2. app的推广

    安卓之家:http://www.ard9.com/bgxx/2639206.html 安贝市场:http://app.youxibaba.cn/app/info/appid/303997 安卓园:ht ...

  3. 技海拾贝 - Java

    1. Java中的多线程 http://blog.csdn.net/luoweifu/article/details/46673975 Java中继承thread类与实现Runnable接口的区别 h ...

  4. UE4 材质切换(带动画效果)

    先看效果图:小木块掉到地板上(小木块本身会消失掉),地板就开始了动效材质切换.引擎版本用的是4.11.2 方法步骤: 首先在UE4内容浏览器中新建一个材质. 第一步要实现一个扫光的效果,如下图. 实现 ...

  5. icmp_ping学习笔记

    1.用字符串指针做为发送缓冲区和接收缓冲区的指针: 2.icmp报文类型结构体可自行定义,也可用<netinet/ip_icmp.h>中定义好的strcut icmp结构体: 3.ip_h ...

  6. IOS 线程处理 子线程

    IOS 线程处理 子线程的启动与结束 技术交流新QQ群:414971585   IOS中,如果要在主线程中启动一个子线程,可以又两种方法: [NSThread detachNewThreadSelec ...

  7. 记录并分享一下安卓通讯录导入到IPhone

    仅仅记录一下我自己的步骤: 前提:我开始用的是诺基亚1202,黑白屏的功能机: 1.将卡放到安卓手机里面,用应用宝导出全部联系人为VCF后缀文件: 2.下载ITools,用它连接IPhone,导入到I ...

  8. https/相对路径,绝对路径

    1. htttps HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全 ...

  9. Lua C++ Binding之Lunar, Luna

    服务端引擎的脚本, 我们项目在老端游项目上发展, 采取的是Lua脚本. 当前服务端的发展趋势是瘦引擎, 胖脚本模式, 基本上引擎负责的功能非常少, 主要是网络, 定帧, 定时器, 引擎通过导出相应的接 ...

  10. C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏

    const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...