一、什么是JVM
JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现···
1、Java文件是如何被执行的?
- 在聊这个之前,需要了解几个概念:类加载器、方法区、堆、栈、程序计数器
- 类加载器:将 .class文件全部搬进JVM里面
- 方法区:用于存放类似于元数据信息方面的数据的,比如类信息,常量,静态变量,编译后代码···等
- 堆: 主要放了一些存储的数据,比如对象实例,数组···等
- 栈:这是我们的代码运行空间。我们编写的每一个方法都会放到这里面运行。
- 程序计数器:主要就是完成一个加载工作,类似于一个指针一样的,指向下一行我们需要执行的代码。
回到刚才的问题:Java文件如何被执行的?
1.Java文件经过编译后变成 .class 字节码文件
2. 字节码文件通过类加载器被搬运到 JVM 虚拟机中
这其中
方法区,堆都为线程共享区域,有线程安全问题,
栈和本地方法栈和计数器都是独享区域,不存在线程安全问题。
2、类加到虚拟机的流程
从类被加载到虚拟机内存中开始,到释放内存总共有五个步骤:加载,连接(验证,准备,解析),初始化,使用,卸载
其中连接可分为 验证,准备,解析
1.加载
- 将class文件加载到内存
- 将静态数据结构转化成方法区中运行时的数据结构
- 在堆中生成一个代表这个类的 java.lang.Class对象作为数据访问的入口
2.验证:确保加载的类符合 JVM 规范和安全,保证被校验类的方法在运行时不会做出危害虚拟机的事件,其实就是一个安全检查
3.准备:为static变量在方法区中分配内存空间,设置变量的初始值
4.解析:虚拟机将常量池内的符号引用替换为直接引用的过程
5.初始化:其实就是一个赋值的操作,它会执行一个类构造器的方法。由编译器自动收集类中所有变量的赋值动作
6.卸载:GC将无用对象从内存中卸载