“朝暮朝思,俯首伏赏。”
“每个人都是楚门,也都是NPC。”
一、对一些概念的理解
指令集:指令顾名思义就是用来引导某一硬件工作的方式的,集即集合的意思,也就是很多种不同引导指令的集合! 指令集在事先就会被写好,我们经常看到的mov,add,等都为助记符。
加载:从硬盘到内存
栈帧:管理程序执行的顺序。
开源的:指提供标准,比如,操作系统在制作时,就会参照JVM标准。虚拟机就是一种标准,很多操作系统都可以定制实现。
类变量:所有的实例都可以访问,在准备工作阶段。
二、jdk,jre和jvm的包含关系
1.JDK是整个Java的核心,包括了Java运行环境JRE、一堆Java工具(开发工具—-编译器、调试器和其它工具)和Java基础的类库(即Java API 包括rt.jar)。JDK ----Java开发工具包,用于Java程序的开发。jdk将源文件编译为.class文件。
2.JRE,包含了一个JVM(Java虚拟机),与Java核心类库与其所支持的文件
如果想运行一个开发好的Java程序,计算机中只需要安装JRE即可。JRE ----Java运行时环境,只能运行.class文件,不能编译。
3.JVM功能:将字节码文件(扩展名为.class的文件)解释成具体系统平台的机器指令。由虚拟机将程序解释给本地系统执行。JVM ----Java虚拟机,Java运行时环境。jvm将.class文件解释执行,映射到cpu指令集或os的系统调用。
结论:
1.有JVM就可以解释执行字节码文件(.class).
2.JVM解释执行这些字节码文件的时候需要调用类库,如果没有这些类库JVM就不能正确的执行字节码文件,JVM+类库=JRE,
3.有了JRE就可以正确的执行java程序了,但是光有JRE不能开发Java程序,所以JRE+开发工具=JDK,有了JDK,就可同时开发,执行JRE。
原文链接:https://blog.csdn.net/m0_56673710/article/details/126093658
2.1.JVM的组成
JVM
由类加载器、运行时数据区、执行引擎、本地方法接口等4个部分组成。
2.2 JIT定时编译
JIT定时编译:将热点字节码文件提前保存在内存,增加程序执行速度
为什么进行字节码校验:.class文件来源有很多,网页或者程序当中
2.3 EJB
EJB:企业级JavaBean,和dubbo类似,可以将功能封装在服务器端,以服务的形式对外发布,客户端在无需知道方法细节的情况下来远程调用方法, 但是是重量级的启动时间很长。
网络也有自己的jvm,他会加载专门的war格式的class.
三、Java类加载机制
3.1类加载过程
加载:称获取定义该类的二进制字节流,完成存储结构的转化,在内存中生成一个代表该类的 Class
对象。
验证:确保 Class
文件的字节流符合当前jvm的版本
准备:准备阶段为类变量分配内存并设置初始值,如果是变量,那么就初始值为0,如果是常量,直接放入运行时常量池,类加载只进行一次,实例化可以进行多次。
解析:常量池的符号引用替换为内存地址的过程,
初始化:<clinit>()
是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并。
3.2接口加载过程
接口中不可以使用静态语句块,但仍然有类变量初始化的赋值操作。执行接口的 <clinit>()
方法不需要先执行父接口的<clinit>()
方法,只有当父接口中定义的变量使用时,父接口才会初始化。另外,接口的实现类在初始化时也一样不会执行接口的 <clinit>()
方法。
3.3类加载的时机
那么什么时候才会被类加载呢
3.3.1主动引用
- 程序创建一个类的实例对象。
- 程序访问类的静态变量,调用
- 程序给类的静态变量赋值。
- 程序调用类的静态方法。比如main方法的调用,实际上就是调用demo01.main(args)静态方法。
- 使用
java.lang.reflect
包的方法对类进行反射调用。 - 加载一个类,如果其父类还未加载,则先触发该父类的加载。
- 当一个接口中定义了
JDK8
新加入的默认方法
四、类加载器
加载了一个类的就是类加载器,或者具有类加载器过程的,不管哪一个类加载器,都经过了类加载过程。
两种:启动类加载器,其他类加载器
4.1启动类加载器(Bootstrap ClassLoader
)
4.2扩展类加载器(Extension ClassLoader)
4.3应用程序类加载器(Application ClassLoader)
应用程序是由三种类加载器互相配合,从而实现类加载,除此之外还可以加入自己定义的类加载器。第三方Jar包。
4.4双亲委派模型
类加载器之间的层次关系,称为双亲委派模型。该模型要求除了顶层的启动类加载器外,其它的类加载器都要有自己的父类加载器。这里的父子关系一般通过组合关系(Composition
)来实现,而不是继承关系(Inheritance
)。
工作机制:一个类加载器首先将类加载请求转发到父类加载器,只有当父类加载器无法完成时才尝试自己加载。每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个请求时,子加载器才会尝试自己去加载
作用:分层,统一,层级越上,类加载器加载出来的类可以覆盖层级低,Object程序中使用的所有的 Object
都是由启动类加载器所加载的 Object
。
五、对象的创建过程
step1:类加载检查,虚拟机遇到一条 new
指令时,
step,2:分配内存,为新生对象分配内存,分配内存的值都是计算出来的,方便分配空间,也方便回收
step3:给类成员变量初始化零值。
step4:虚拟机要对对象进行必要的设置,是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中,以及锁的lock,和指针。
step5:从Java
程序的视角来看,对象创建才刚开始,init构造方法。