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整体架构
以上就是今天的全部内容,需要了解更多java架构师知识的小伙伴请关注奇Q工具网。
推荐阅读: