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. 号外:MS被开源软件打败了!

    [编辑推荐]微软宣布.NET将开源 支持Mac OS X和Linux (149/16525) » [最多推荐]Visual Studio Contact(); 直播笔记(44/2744) » [最多评 ...

  2. awk(1)-简述

    1.概述 AWK is a programming language designed for text processing and typically used as a data extract ...

  3. 项目中Gradle使用总结

    一.配置Gradle使用Maven仓库 项目过程中,我们可能会遇到maven的本地库和gradle使用的maven本地库,不是同一个库.现在总结下怎么配置使得maven和gradle都使用相同的mav ...

  4. CLR via C# 3rd - 04 - Type Fundamentals

    1. System.Object        The runtime requires every type to ultimately be derived from the System.Obj ...

  5. LintCode Edit Distance

    LintCode Edit Distance Given two words word1 and word2, find the minimum number of steps required to ...

  6. dede 优化打开速度

    织梦DedeCMS本地后台运行速度慢 不知道从什么时候开始,织梦DedeCMS在本地PHP环境进行测试的时候,后台的运行反应会非常的慢,经常过了很久都没有反应.运行很久之后,还会出现了“\includ ...

  7. CoreData数据库

        一  CoreData 了解 1 CoreData 数据持久化框架是 Cocoa API 的一部分,首先在iOSS5 版本的系统中出现:      它允许按照 实体-属性-值 模式组织数据: ...

  8. Bash漏洞批量检测工具与修复方案

    <img src="http://image.3001.net/images/20140928/14118931103311.jpg!small" t ...

  9. UVA 10474

    题意:给你一组数,再给几个数问是否在一组数中. 题很简单:STL入门. 没用到STL. #include<iostream> #include<cstdio> #include ...

  10. imooc-java-作业练习-20150918

    小伙伴们,请根据所学知识,编写一个 JAVA 程序,实现输出考试成绩的前三名 要求: 1. 考试成绩已保存在数组 scores 中,数组元素依次为 89 , -23 , 64 , 91 , 119 , ...