天天看点

JVM java虚拟机

一、什么是JVM

JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现···

1、Java文件是如何被执行的?

  1. 在聊这个之前,需要了解几个概念:类加载器、方法区、堆、栈、程序计数器
  2. 类加载器:将 .class文件全部搬进JVM里面
  3. 方法区:用于存放类似于元数据信息方面的数据的,比如类信息,常量,静态变量,编译后代码···等
  4. 堆: 主要放了一些存储的数据,比如对象实例,数组···等
  5. 栈:这是我们的代码运行空间。我们编写的每一个方法都会放到这里面运行。
  6. 程序计数器:主要就是完成一个加载工作,类似于一个指针一样的,指向下一行我们需要执行的代码。

回到刚才的问题:Java文件如何被执行的?

1.Java文件经过编译后变成 .class 字节码文件

2. 字节码文件通过类加载器被搬运到 JVM 虚拟机中

这其中

方法区,堆都为线程共享区域,有线程安全问题,

栈和本地方法栈和计数器都是独享区域,不存在线程安全问题。

2、类加到虚拟机的流程

从类被加载到虚拟机内存中开始,到释放内存总共有五个步骤:加载,连接(验证,准备,解析),初始化,使用,卸载

其中连接可分为 验证,准备,解析

1.加载

  1. 将class文件加载到内存
  2. 将静态数据结构转化成方法区中运行时的数据结构
  3. 在堆中生成一个代表这个类的 java.lang.Class对象作为数据访问的入口

2.验证:确保加载的类符合 JVM 规范和安全,保证被校验类的方法在运行时不会做出危害虚拟机的事件,其实就是一个安全检查

3.准备:为static变量在方法区中分配内存空间,设置变量的初始值

4.解析:虚拟机将常量池内的符号引用替换为直接引用的过程

5.初始化:其实就是一个赋值的操作,它会执行一个类构造器的方法。由编译器自动收集类中所有变量的赋值动作

6.卸载:GC将无用对象从内存中卸载