对Java平台的理解
1.跨平台(一次编译到处运行)和GC(垃圾回收机制)二大特点
JVM屏蔽了操作系统系统和硬件的差异,使得符合Java规范的代码可以运行在JVM中,实现一次编译,到处运行
2.JAVA语言特性
抽象:屏蔽实现的细节,将复杂的问题抽象化
指令集是对CPU的抽象,文件时对输入、输出设备的抽象,虚拟存储器时对程序存储的抽象,进程是对一个正在运行的程序的抽象,而虚拟机是对整个计算机的抽象(包括操作系统、处理器、程序) --《深入理解计算机系统》
面向对象特点(继承,封装,多态) 泛型 Lambda 反射
封装:隐藏类的属性和实现细节,对外提供公共访问方式,提高代码的复用性
继承:是多态的基础,没有继承就没有多态。 对父类进行扩展
多态:同一个方法可以有不同的实现,这就是面向对象中的多态(接口的多种不同的实现方式即为多态)
实现机制:父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,由于程序调用方法是在运行期才动态绑定的,那么引用变量所指向的具体实例对象在运行期才确定。所以这个对象的方法是运行期正在内存运行的这个对象的方法而不是引用变量的类型中定义的方法。
3.JRE:就是Java运行环境,包含了 JVM,和java类库
JDK:看作JRE的超集,提供了更多工具,比如编译器,各种诊断工具
4.classloader有两种装在class的方式:
隐式:运行过程中,碰到new生成的对象,隐式调用classloader到JVM
显示:class.forName()动态加载
类加载过程
1.装载:查找和装入类或接口的二进制数据
2.连接
(1) 验证:检验装入类或接口的二进制数据的正确性。
(2) 准备:为静态变量分配存储空间。
(3) 解析:将常量池内的符号引用替换为直接引用。
3.初始化:**类的静态变量和静态代码块
类加载器的层次关系:
BootstrapLoader是由C/C++实现,我们无法在程序中获取它的实例,这个装载器负责装载lib目录下的dt.jar、tools.jar等Java核心核心类库。
ExtClassLoader这个装载器负责装载jdk/lib/ext目录下的jar包。
AppClassLoader这个装载器主要负责装载classpath目录下的类。
类的装载遵循“双亲委派”模式
5.Java 是解释执行对吗?
Java解释执行,这句话不准确,开发的源代码首先通过Javac编译成字节码,然后在运行时,通过虚拟机内嵌的解释器将字节 码转化机器码。JVM中提供了JIT(Just In Time) 编译器也就是动态编译器。JIT能够在运行时将热点代码编译为机器码,这段热点代码就是编译执行,而不是解释执行。
Java分为编译期和运行期
编译期:将源代码编译为以“.class”结尾的字节码文件
运行期:将字节码文件加载进虚拟机进行解释或者编译执行
在运行期HotSpot采用混合模式,先解释执行字节码,而后反复执行的热点代码在以方法为单位即时编译
HotSpot内置了多个即时编译器 ,C1,C2.并采用分层编译。热点代码C1编译,热点中的热点C2编译
解释执行:逐条将字节码编译为机器码在执行(同声传译)
即时编译:以方法为单位将字节码先编译为机器码在执行(放录音)