jvm虚拟机怎么使用?工作原理解析

jvm虚拟机的使用是怎么进行的呢?小伙伴们了解过吗?下面我们就来了解它的使用方法和原理。

Jvm实现

类加载流程

入口Result CONSTANT_Class_info::resolve()

流程:

调用ClassLoader的get_class:class_file->class_loader->get_class(resolved_class_name, utf8_info->length);

如果class已经被加载过:使用加载过的ClassFile。

如果class没有被加载过:调用ClassLoader的load_class加载class。每个新加在的class由ClassFile表示

ConstantPool

表示class文件的constant pool。ConstantPool构造需要ClassFile

Result CONSTANT_Class_info::resolve()

加载相应的class文件,得到对应的ClassFile对象。

ClassFile

表示一个被加载到内存的java class(从class文件加载到内存)。

ClassFile::make_bootable(filepath, boot_method, boot_instance);

创建一个bootstrap(类名是__boot_class__) class和一个main method,该方法的实现就是直接调用jvm启动参数中给出的class的main方法。

执行class的静态初始化代码,即clinit,用来初始化static变量。

Result ClassFile::read(u1 *& stream_pointer)

从文件流中读数据,根据class的格式定义解析。

ClassLoader

不支持字节码验证功能。

ClassLoader::find_class

查找class是否已经被加载过,如果没有被加载过,调用load_class加载。

ClassLoader::get_class

查找是否已经被加载过。

ClassLoader::define_class

创建这个class的ClassFile对象。如果该class不是Object,还会加载相应的接口和父类。

针对每个被加载的class,还会创建一个Class对象(object of Class),即Object.getClass()的返回值。

ClassLoader::load_class

加载class。先调用parent classloader,采用类加载的代理(delegate)模型。

JVM原理

首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件,然后JRE加载Java字节码文件,载入系统分配给JVM的内存区,再来执行引擎解释或编译类文件,最后由即时编译器将字节码转化为机器码。如图:

jvm虚拟机怎么使用  工作原理

JVM整体架构

jvm虚拟机怎么使用  工作原理

以上就是今天的全部内容,需要了解更多java架构师知识的小伙伴请关注奇Q工具网。

推荐阅读:

JVM内存模型原理有哪些?

jvm如何查看gc日志?jvm gc日志分析

JVM的收集器是指什么?有哪些?