JVM学习笔记-JVM如何工作

JVM架构?

JVM(Java虚拟机)充当运行Java应用程序的运行时引擎。JVM实际上是调用java代码中存在的main方法的。JVM是JRE(Java运行时环境)的一部分。

Java应用程序称为WORA(Write Once Run Anywhere)。这意味着程序员可以在一个系统上开发Java代码,并且可以期望它在任何其他支持Java的系统上运行而无需任何调整。由于JVM,这一切都是可能的。

编译.java文件时,Java编译器会生成具有相同文件名的.class文件(包含字节码)。当我们运行它时,这个.class文件会进入各个步骤。这些步骤一起描述了整个JVM。
JVM学习笔记-JVM如何工作_第1张图片

它主要负责三项活动。

载入中
链接
初始化
加载:类加载器读取.class文件,生成相应的二进制数据并将其保存在方法区域中。对于每个.class文件,JVM在方法区域中存储以下信息。

已加载类的完全限定名称及其直接父类。
无论的.class文件与类或接口或枚举
修改器,变量和方法信息等
加载.class文件后,JVM会创建一个Class类型的对象,以在堆内存中表示此文件。请注意,此对象的类型为java.lang包中预定义的类。程序员可以使用这个Class对象获取类级别信息,如类名,父名,方法和变量信息等。要获得此对象引用,我们可以使用Object类的getClass()方法。

链接:

执行验证,准备和(可选)解决方案。

验证:它确保.class文件的正确性,即它检查此文件是否正确格式化并由有效编译器生成。如果验证失败,我们会得到运行时异常java.lang.VerifyError。
准备:JVM为类变量分配内存并将内存初始化为默认值。
解决方案:这是使用直接引用替换类型的符号引用的过程。通过搜索方法区域来定位引用的实体来完成。
初始化:在此阶段,所有静态变量都分配有在代码和静态块(如果有)中定义的值。这在类中从上到下执行,在类层次结构中从父到子执行。
一般来说,有三个类加载器:

Bootstrap类加载器:

每个JVM实现必须有一个引导类加载器,能够加载受信任的类。它加载JAVA_HOME / jre / lib目录中的核心Java API类。此路径通常称为引导路径。它以C,C ++等本地语言实现。
扩展类加载器:它是bootstrap类加载器的子代。它加载扩展目录JAVA_HOME / jre / lib / ext(扩展路径)中存在的类或java.ext.dirs系统属性指定的任何其他目录。它由sun.misc.Launcher $ ExtClassLoader类在java中实现。
系统/应用程序类加载器:扩展类加载器的子代。它负责从应用程序类路径加载类。它在内部使用映射到java.class.path的Environment Variable。它也是由sun.misc.Launcher $ AppClassLoader类在Java中实现的。

你可能感兴趣的:(☆Ops)