JVM的学习大多繁琐,但在学习JVM之前,我们必须了解到在我们手下写出来的一个个代码是怎么灵动的跑起来的,从而转到JVM的学习。
程序是怎么跑起来的?首先,假设写好了一份HelloWorld.java的代码。
public class HelloWorld{ public static void main(String[] args){ System.out.pringln("Hello World!"); } }
然后这个HelloWorld.java的程序要想跑起来,首先必须经过javac HelloWorld.java编译,将.java文件编译为虚拟机可以解析的.class文件,之后便可以通过 java HelloWorld进行运行。
此时在你使用java HelloWorld命令进行运行时,此时就会启动一个jvm进程,由这个进程来运行我们已经写好的程序。基本运行过程如下:
1.首先由类加载器将编译好的.class文件加载到内存中
2.jvm通过自身的字节码执行引擎,来执行已经加载到内存中的代码
这样一个完成HelloWorld程序就跑了起来!
JVM加载运行流程一个类的加载运行一般会经过以下几个过程:
加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
加载:加载就是由JVM将编译好的字节码加载到内存中。
验证:根据Java虚拟机规范校验生成的.class文件是否符合指定的规范。
准备:为加载的类以及类的变量属性分配内存空间,并为属性变量置一个初始值。
解析:把符号引用替换为直接引用。
初始化:为类中的变量根据代码进行重新赋值初始化
类加载器:见名知意,类的加载器有以下几种
1.启动类加载器(BootStrap Classloader):负责加载Java核心类:%JAVA_HOME%lib
2.扩展类加载器(Extension Classloader):负责加载Java核心类:%JAVA_HOME%libext
3.应用程序类加载器(Application Classloader):加载项目中代码类
4.自定义类加载器:可以根据自己需求自定义自己的类加载器
双亲委派机制:JVM的类加载器是有亲子层级结构的,就是说启动类加载器是最上层的,扩展类加载器在第二层,第三层是应用程序类加载器,最后一层是自定义类加载器。
假设应用程序需要加载一个类,他会首先委派给自己的父类进行加载,通过层层传递,最终传到顶层的类加载器中进行加载,如果没有加载到,就会下推加载权利给自己的子类加载器。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)