1、初始JVM

26 阅读2分钟

1. Java代码是如何运行的

java文件编译为class文件

class通过类加载器,加载进入JVM

通过字节码执行引擎,从main函数执行代码

image.png

2. JVM在何时会加载一个类

类的加载,一般会经历如下过程:

加载->验证->准备->解析->初始化->使用->卸载

加载

何时加载?代码中使用到该类了,就会进行加载。

-------------------------------------准备阶段------------------------------------------

验证

根据Java虚拟机规范,校验class文件的内存,是否符合规范

准备

给类分配一定的内存空间,给类变量(static变量)分配内存空间,来一个默认的初始值

解析

符号引用替换为直接引用

-------------------------------------准备阶段------------------------------------------

核心阶段:初始化

执行类的初始化代码,包括静态代码块,也会在这个阶段执行,同时如果发现父类没有初始化,先初始化父类。

3. 类加载器和双亲委派机制

Bootstrap ClassLoader,主要负责加载安装的Java目录下的核心类,即lib目录。

Extension ClassLoader,加载lib\ext目录。

Application ClassLoader,负责加载ClassPath环境变量所指定的路径中的类,加载那些Javaer写好的类。

自定义类加载器:根据自己的需求加载类。

双亲委派机制:


先找父亲去加载,不行的话再由儿子来加载。

4. JVM内存分布

  • 1.8前方法区,1.8后MetaSpace元数据空间,存放各种类相关信息。
  • 程序计数器:记录当前执行的字节码指令的位置,每个线程一个。
  • 虚拟机栈: 记录每个方法内的局部变量等数据,每个线程一个。
  • 堆内存: 存放代码中创建的各种对象。
  • 本地方法栈: 如public native int hashCode(),这里面根虚拟机栈类似,存在各组native方法的局部变量表之类的信息。
  • 堆外内存: NIO的allocateDirect分配的。

5. JVM的垃圾回收机制

他是一个后台自动运行的线程,不断检查JVM堆内存中的各个实例对象,如果某个实例对象没有一个方法的局部变量指向他,也没有任何一个类的静态变量,包括常量等地方指向他,那么就会把他当垃圾进行清除掉。