深入java虚拟机学习笔记

java虚拟机:
java虚拟机包括一个classloader 和一个执行引擎。
执行引擎:
执行引擎的实现多种多样,主流有4种
1:解释执行 最简单的执行方式。
2:just-in-time compiler 编译的时候缓存编译出来的本地机器码,然后执行。缺点是浪费内存。
3:自适应优化器 属于解析执行和juest-in-time的折衷产品。首先解释执行,然后监控,碰到有性能损耗比较大的代码块,就缓存机器码执行。
4:机器内嵌实现的执行器
前三种都是软件实现的执行引擎。
如果是以软件方式实现的执行引擎,那么 java程序通过调用native-method与本地机器进行交互。
java有两张方法,java方法和native-method。java方法是编译后保存在class文件中的,是可移植的。而native-method是通过底层代码例如C++、汇编其它语言编写的,编译成机器代码保存在动态链接库中,是不可移植的。
如果调用了非java api的native-method,那么这块java代码就是非平台无关的了。

名词解释:JNI java native-method interface 本地方法接口

类装载器 classloader
系统类加载器(默认) 用户自定义类加载器
用户自定义的类加载器是可以在系统类加载器上面的,可以是一个纯java程序。
一个类被装载之后,他所引用到的类,必然是通过同一个classloader装载进来的,默认一个类只能看见同一个classloader装载的其他类。因为这种特性,java允许一个应用有多个namespace。从不同源文件获取的class文件应该分割在不同的namespace当中,这样可以控制影响范围,也可以控制一些恶意代码。

java 平台无关的局限性
1:只有在部署了虚拟机的机器上才能跑
2:java的版本变化
3:不能调用本地方法 native-method
4:使用非标准API时需要知道是否调用native-method
5:不能以来finalization 和线程优先级来确保程序正常运行。
因为finalization在不同的垃圾收集器当中运行的时间是不一样的。而java的线程优先级没有要求高优先级的获得cpu时间片的时候低优先级不能获得cpu时间。
6:界面依赖
7:java平台的BUG

java的安全性
java使用沙箱模型来限制java程序对系统的破坏。
java的基本沙箱包括:
类装载器模型 class文件校验器 内置于语言和虚拟机的安全特性 安全管理和java api


类装载器通过使用双亲委派模型来进行一些安全策略。
双亲委派模型,将虚拟机划分成四层
启动类加载器(java核心包)
扩展包加载器
classpath加载器
网络加载器
类加载器会首先从最上层的加载器中加载,找不到的时候再逐层往下,当一个网络class文件想要伪造一个java核心包里面的代码时,会直接从启动类加载器中读取,防止伪造。而当比如一个java.lang.virus的病毒文件想要访问其它java.lang库类的时候,会发现,他是从网络加载器里面加载的,和启动加载器不在同一个加载器当中而无法访问。

class文件校验器
class文件校验器会对class文件做四次校验
第一次校验在装载class文件时检查,检查class的内部接口,确保能否被正常编译
第二次和第三次是在连接过程中检查的。分别检查语义和字节码
第四次检查动态引用到的类和方法确实存在。

安全管理器
默认不会加载任何的安全管理器,需要应用自己通过System.setSecurityManager()的方法来定义安全管理器。java提供了一个默认的SecurityManage实现类,也可以通过-Djava.security.manage来指定。
java1.2之后的安全管理器大多是调用一个checkPermission(Permission perm)的方法来进行安全校验,如果校验通过就正常返回,否则就抛出异常。
checkPermission方法只是简单的调用一个静态方法,讲Permssion对象传递到AccessController当中,具体的安全策略则由AccessController来掌握。

你可能感兴趣的:(java,虚拟机,jni,Security,网络应用)