最近花了点时间看了Bill Venners的《深入JAVA虚拟机》,这本书深入剖析了JAVA虚拟机规范,我自己则挑了一些原理性的章节来看,等过后有时间还要再好好通读一遍。

 

第一章 JAVA体系结构

1.JAVA体系结构:JAVA语言+CLASS文件格式+JAVA API+JAVA虚拟机。

2.JNI:JAVA本地接口。

3.类装载器分为启动类装载器和用户定义类装载器,同一个类装载器装载的类可以相互调用,不同类装载器装载的类无法直接访问,有效控制恶意代码。

4.JAVAàJAVA API---(左边平台无关,右边平台相关)-à本地方法—>主机操作系统。

5.JAVA在内存管理和线程管理的不确定性。

 

第三章 安全

1.沙箱:放置JAVA程序,并限制其活动。

2.沙箱发展:基本沙箱(1.0版)---代码签名和认证(1.1版)---细粒度访问控制(1.2及1.2以上版)。

3.沙箱基本组件:类装载器结构,CLASS文件检验器,内置于JAVA虚拟机的安全特性,安全管理器及JAVA API。

4.第一道防线---类装载器:

作用:防止恶意代码干涉善意代码,守护被信任类库的边界,将代码归入某域确定域内代码可执行的操作。

装载顺序:采用双亲委派模型,即每个类装载器装载一个类时,总是先交给其双亲装载器装载,如果双亲无法装载,则抛给其子装载器装载。这个模式同样适用于多级亲子结构的类装载器。这样的装载模式防止了用户自定义类装载器装载恶意的与JAVA核心类同名的类,因为所有类装载器的最终双亲都是启动类装载器,启动类装载器通过名字装载的是JAVA核心类,不会装载到同名的恶意代码。并且不同类装载器装载的类之间是相互隔离的。

5.CLASS文件检验器:检验程序的健壮性,在执行前而不是执行时检验,包括4趟检验。

6.JAVA内置安全特性:

类型安全的引用转换

结构化的内存访问

自动垃圾回收

数组边界检查(防止数组越界)

空引用检查(防止NULL指针)

异常的结构化处理

 

第五章 JAVA虚拟机

1.虚拟机运行的线程包括守护线程和非守护线程,其中守护线程包括垃圾回收线程等,非守护线程为运行main()函数的线程及由main()创建的为特别声明的线程。当所有的非守护线程运行结束时,虚拟机自动终止守护线程并退出。

2.运行时数据区:方法区(线程共享),堆(线程共享),本地方法栈(线程共享),JAVA栈(线程独立拥有),PC寄存器(线程独立拥有)。

3.类装载器执行过程:装载à连接à初始化。

4.方法区:保存被装在类型的信息,类型信息包括类全名,继承的直接超类,继承的直接接口,类/接口的标识,访问修饰符,常量池,字段信息,方法信息,到CLASSLOADER的引用,到CLASS类的引用。

5.堆:保存类实例和数组,所有线程共享堆但都有自己的堆空间。

6.JAVA栈:以栈帧为单位,执行方法时压入栈,退出方法时弹出栈,栈帧保存了方法参数,局部变量和中间结果。

7.本地方法栈:独立于JAVA栈,与本地方法有关,依赖于实现。

8执行引擎:指令集定义的,是一个线程。

9.指令集:

以栈为中心而非以寄存器为中心,保证了JAVA的平台无关性

使得执行可优化

增强CLASS文件的紧凑性

CLASS文件需要字节码验证,如使用数据流分析器。

10.本地方法接口:增加JAVA可移植性,分离具体的支持JNI的虚拟机实现和具体的本地方法实现。