C和C++代码无需额外的运行,可以直接编译成CPU能够理解的机器码,
为什么Java要在虚拟机里运行?
1,Java作为一门高级程序语言,语法非常复杂,抽象程度很高,直接在硬件上运行并不现实。
2,脱离底层硬件的依赖,只要能够安装虚拟机,就可以实现一次编写,到处运行。
3,虚拟机带来了托管环境,能够替代码处理冗长而且容易出错的部分。如自动内存管理,垃圾回收,数组越界,动态类型转换等。
Java如何运行的?
JAVA编译后生成class的字节码文件,class文件被JVM加载。加载后的Java类存放在方法区,运行时JVM从方法区调用Java类。
JVM存放Java的空间分为:方法区,堆,本地方法栈,Java方法栈,PC计数器
方法区:存放加载后的Java类
堆:存放运行时Java类对象
本地方法栈:局部变量和字节码的操作数
PC计数器:不同线程的执行位置
本地方法栈:C++代码的局部变量和字节码操作数
Java编译成class文件后,被JVM翻译成机器码的过程主要有两种方式:解释执行和即时编译
Java的8种基本类型:int,char,byte,double,float,short,long,boolean
Java作为面向对象的语言,为什么要保存8种基本类型,而不是所有都面向对象?
为了在执行效率和内存方面提升性能
JVM如何加载Java类?
Java编译成class文件,然后被JVM加载到内存中成为可以运行的对象,主要分为三个步骤:加载,链接,初始化
加载:启动类加载,扩展类加载(平台类加载),应用类加载;双亲委派模型
链接:验证,准备,解析。准备:为类的静态字段分配内存;解析:符号引用解析为实际引用
初始化:
1,虚拟机启动时,初始化用户指定的主类
2,遇到用户新建目标实例new指令时,初始化new指令的目标类
3,静态方法指令时,初始化静态方法所在的类
4,访问静态字段指令时,初始化静态字段所在的类
5,子类初始化会触发父类初始化
6,接口定义了default方法,直接实现或者间接实现接口的类初始化,触发接口初始化
7,反射API调用对某个类进行反射调用
8,调用MethodHandle实例时