1.java的体系结构
java虚拟机
类装载器的体系结构
java class 问题就
java API
java程序设计语言
2.平台无关性
基于java平台的版本
如果使用了本地方法,这样的话就跟平台相关
保证程序的最佳可移植性而采取的途径:
a.选择程序要运行的主机和设备的集合
b.在目标宿主机中选择自认为足够好的java平台版本,在改版本java平台上编写、运行程序
c.对每个目标宿主机,选择一些程序将要运行的java平台实现
d.编写程序,使它只通过java API 的标准运行库来访问计算机(不要使用本地方法,或者开发商专有的那些调用本地的方法库)
e.编写程序,使它不依赖垃圾收集器及时终结的正确性,也不依赖线程的优先级
f.努力设计一个用户界面,使它在你所有的目标宿主机上都能正常工作
g. 在所有的目标运行时的环境和所有的目标宿主机上测试程序
3.安全
组成java沙箱的基本组件有:
a.类装载器结构
b.class文件检验器
c.内置于java虚拟机的安全性
d.安全管理器及java API
用户可以自定义沙箱
a.在java沙箱中,类装载器体系结构是第一道防线,
类装载器体系结构作用:放在恶意代码去干涉善意的代码(通过由不同的类装载器载入的类提供不同的命名空间实现的),守护了被信任的类库的边界(通过分别使用不同的类装载器可靠的包和不可靠的包来实现,还可以通过简单的拒绝装载特定的禁止类型就可以了),将代码归入某类,该类确定了代码可以进行的操作
b.class文件检查器
class文件检查器保证装载的class文件内容有正确的内容结构,并且这些class文件相互间协调一致
class文件检查器要进行四趟独立的扫描来完成他的操作:第一趟:class文件的结构检查,第二趟:类型数据的语义检查,第三趟:字节码验证,第四趟:符号引用的验证
c.内置于java虚拟机的安全性(类型转换等)
d.安全管理器和java API
abc起到一个共同的目的:保持java虚拟机的实例和它正在运行的应用程序的内部完整性,使得他们不被下载的恶意或有漏洞的代码侵犯。安全管理器主要用于饱和虚拟机的外部资源不被虚拟机内运行的恶意或有害的代码侵犯,定义了沙箱外部边界可以被定制
4.网络移动性
5.java虚拟机
a.java虚拟机是什么(抽象的规范,一个具体的实现,一个运行的虚拟机实例)
b.java虚拟机的生命周期
一个运行时的java虚拟机实例的天职就是:负责运行一个java程序。当启动一个java程序时,一个虚拟机实例也就诞生了,当该程序关闭退出,这个虚拟机实例也就随之消亡。如果在同一台计算机上同时运行三个java程序,将得到三个java虚拟机实例。每个java程序都运行于自己的java虚拟机实例中。
java虚拟机实例通过调用某个初始类的main()方法来运行一个java程序。而这个main()方法必须是共有的(public)、静态的(static)、返回值为void、并且接受一个字符串数组作为参数。任何拥有这样一个main()方法的类都可以作为java程序运行的起点。
java虚拟机内部有两种线程:守护线程与非守护线程。守护线程通常是由虚拟机自己使用的,比如执行垃圾收集任务的线程。但是java程序也可以把它创建的任何线程标记为守护线程,而java程序中的初始线程(main())是非守护线程。只要有任何非守护线程在运行,那么这个java程序也在继续运行,当该程序中的所有非守护线程都终止时,虚拟机实例将自动退出
c.java虚拟机的体系结构
一个虚拟机实例的行为是分别按照子系统、内存区、数据类型及指令
c.1 数据类型(基本类型和引用类型),基本类型的变量持有原始值(真正的原始数据),引用类型的变量持有引用值(“引用值指的是某个对象的引用,而不是该对象本身”)
c.2 字长的考量
c.3 类装载子系统,java虚拟机有两种类装载器:启动类装载器和用户自定义装载器。类装载器子系统任务:1装载(查找并装载类型的二进制数据),2连接(执行验证(确保被导入类型的正确性),准备(为类变量分配内存,并将其初始化为默认值),解析(把类型中的符号引用转换为直接引用)),3初始化(吧类变量初始化为正确初始值)。
c.4方法区 对每个装载的类型,虚拟机都会在方法区中存储以下类型的信息:这个类型的全限定名,这个类型的直接超类的全限定名(除非这个类型是java.lang.Object,他没有超类),这个类型是类类型还是接口类型,这个类型的访问修饰符,任何直接超接口的全限定名的有序列表。除了列出的基本类型信息外,虚拟机还得为每个被装载的类型存储以下信息:该类型的常量池,字段信息,方法信息,除了常量以外的所有类变量,一个到类classloader的引用
常量池:虚拟机必须为每个被装载的类型维护一个常量池,常量池就是该类型所用常量的一个有序集合,包括直接常量(string,integer,floating point常量)和对其他类型、字段和方法的符号引用。池中的数据项就像数组一样是通过引索访问的,
字段信息:字段信息清单如下:字段名,字段类型,字段的修饰符
方法信息:方法名,返回类型,方法参数的数量和类型,方法的修饰符
类变量:
c.4堆
c.5程序计数器
c.6java栈