1、跨平台(一次编译到处运行)和GC(垃圾回收机制)二大特点
JVM屏蔽了操作系统系统和硬件的差异,使得符合Java规范的代码可以运行在JVM中,实现一次编译,到处运行
2、JAVA语言特性
- 抽象:屏蔽实现的细节,将复杂的问题抽象化
指令集是对CPU的抽象,文件时对输入、输出设备的抽象,虚拟存储器时对程序存储的抽象,进程是对一个正在运行的程序的抽象,而虚拟机是对整个计算机的抽象(包括操作系统、处理器、程序) --《深入理解计算机系统》
2. 面向对象特点(继承,封装,多态) 泛型 Lambda 反射
封装权限控制符
- 继承:是多态的基础,没有继承就没有多态。 对父类进行扩展
- 多态:多态是可以把子类对象赋给父类变量,但运行时表现出子类的行为特征。这说明,同一类型的对象在运行时可以表现出不同的行为特征。
3、JRE和JDK
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编译
解释执行:逐条将字节码编译为机器码在执行(同声传译)
即时编译:以方法为单位将字节码先编译为机器码在执行(放录音)