jvm加载类(更新中)
作为jvm的用户,从使用者角度来看,我们给jvm输入一个class文件,得到了一个Class对象。
我们可以猜想下jvm加载类的过程:
class文件有规定的格式,jvm去解析class文件流,读magic, major version, minor version等值(最简单的举例),然后生成Klass对象,并放到一个map中。
首先有个全局的认识,jvm把已加载的类放在一个hashtable中。
class SystemDictionary : AllStatic {
// Hashtable holding loaded classes.
static Dictionary* _dictionary;
};
从java.lang.ClassLoader接口的defineClass1方法作为入口,探究类加载的过程;
--> java.lang.ClassLoader/defineClass1
在ClassLoader.c文件中找到Java_java_lang_ClassLoader_defineClass1;
--> JNIEXPORT jclass JNICALL
Java_java_lang_ClassLoader_defineClass1(JNIEnv *env, jobject loader,jstring name,jbyteArray data,jint offset,jint length,jobject pd,jstring source)
--> ./hotspot/src/share/vm/prims/jvm.cpp:1049 JVM_DefineClassWithSource
--> jvm.cpp/jvm_define_class_common
--> Klass* k = SystemDictionary::resolve_from_stream(class_name, class_loader,protection_domain, &st,verify != 0,CHECK_NULL);
--> instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,loader_data,protection_domain,parsed_name,verify,THREAD);
// We can now create the basic Klass* for this klass
--> _klass = InstanceKlass::allocate_instance_klass(loader_data,vtable_size,itable_size,info.static_field_size,total_oop_map_size2,rt,name,super_klass(), !host_klass.is_null(), CHECK_(nullHandle));
--> ik = new (loader_data, size, THREAD) InstanceKlass( //这里用到了operator new的语法
vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, is_anonymous);
--> set_init_state(InstanceKlass::allocated); //状态1
--> define_instance_class(k, THREAD);
--> add_to_hierarchy(k, CHECK);
--> k->set_init_state(InstanceKlass::loaded); //状态2
--> k->eager_initialize(THREAD);
--> eager_initialize_impl(this_oop);
--> link_class_impl(this_oop, true, THREAD); //这里主要是link操作
--> this_oop->set_init_state(linked); //状态3
InstanceKlass中的枚举:
enum ClassState {
allocated, // allocated (but not yet linked)
loaded, // loaded and inserted in class hierarchy (but not linked yet)
linked, // successfully linked/verified (but not initialized yet)
being_initialized, // currently running class initializer
fully_initialized, // initialized (successfull final state)
initialization_error // error happened during initialization
};
//设置类加载过程的状态,通过跟踪这个方法,能大概定位类加载的过程。
void set_init_state(ClassState state);
allocate:
parse class文件流,创建Klass对象,并赋属性值,在这个过程中会对class文件做简单的verify。
常量池的解析也是在这一步。
load
具体的操作好像并不多,只是加到SystemDictionary中而已。
link
从当前类的父类开始,然后是接口,最后才是当前类;
verify 动作,是针对Klass对象,好像是对字节码指令的合法性做校验;
rewrite动作,
jvm加载类(更新中)的更多相关文章
- JVM加载类的过程,双亲委派机制中的方法
JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载 1.1.加载 类的加载阶段,主要是获取定义此类的二进 ...
- [转]jvm加载类规则
jvm包括三种类加载器: 第一种:bootstrap classloader:加载Java的核心类. 第二种:extension classloader:负责加载jre的扩展目录中的jar包. 第三种 ...
- JVM学习(二)JVM加载类
一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
- 自动加载类PHP中spl_autoload_register函数的用法
spl_autoload_register(PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autoloa ...
- JVM加载类冲突,导致Mybatis查数据库返回NULL的一个小问题
今天碰到个bug,虽然小,但是有点意思 背景是SpringMVC + Mybatis的一个项目,mapper文件里写了一条sql 大概相当于 select a from tableA where b ...
- JVM加载类的原理机制
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载.链接和初始化,其中链接又可以分成校验.准备.解析装载:查找和导入类或接口的二进制数据: 链接:执行下面的校验.准备和解析 ...
- jvm加载类的7个步骤
- 虚拟机(JVM)如何加载类
首先JVM加载类的一般流程分三步: 加载 链接 初始化 那么是否全部Java类都是这样三步走的方式加载呢?我们可以从Java的数据类型去出发.Java分基本类型和引用类型.其中按照面向对象的特性,一切 ...
- JVM加载class文件的原理
当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件.那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做[加载 ].加载完成之后,我们就可以进行一系列 ...
随机推荐
- 键盘控制div移动并且解决停顿问题(原生js)
<html> <head> <title>键盘控制div移动,解决停顿问题</title> <meta charset="utf-8&q ...
- 微信小游戏开发之JS面向对象
//游戏开发之面向对象 //在js的开发模式中有两种模式:函数式+面向对象 //1.es5 // 拓展一:函数的申明和表达式之间的区别 // 函数的申明: // function funA(){ // ...
- 学习笔记23—window10 64位 python2.7 安装liblinear
最近在使用pythin,因为要使用libsvm,所以到官网去下载libsvm.官网地址为libsvm(https://www.csie.ntu.edu.tw/~cjlin/libsvm/)结果下载下来 ...
- 解决微信video全屏的问题,不在本页面播放
在微信浏览器中使用video标签,点击播放会跳出本页面,自动进行全屏播放,原因是自动跳转到手机微信内置的浏览器中去播放去了!!! 在video中加上连个属性就好了,反正最近的一个项目,我是这样做的就好 ...
- js中use或者using方法
看Vue.use方法,想起了以前工作中别人用过的use方法. var YANMethod = { using:function() { var a = arguments, o = this, i = ...
- R语言函数总结(转)
R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字符不允许是数字. 基本命令要么是表达 ...
- Linux 各种软件的安装-mediawiki + wordpress篇
php apache mysql 三剑客安装好后,可以愉快地安装一些成熟的web应用啦,比如wordpress可以当做自己的笔记本,mediawiki整理知识库. 首先是mediawiki,网上说不错 ...
- 解决Android Studio卡在Gradle:Resolve dependecies 'app:_debugCompile'问题
转载: http://blog.csdn.net/callzjy/article/details/53662073 该死的破墙,我被恶心了一个晚上. 做墙的技术员,TMD的能不能上点心,至少把技术网站 ...
- Spring Boot设置值:分别用@ConfigurationProperties和@Value给属性设值及其区别
@ConfigurationProperties给属性映射值编写JavaBean/** 将配置文件application.properties中配置的每一个属性值映射到当前类的属性中:* @Confi ...
- [Spring] Aspect Oriented Programming with Spring | AOP | 切面 | 切点
使用Spring面向切面编程 1.介绍 AOP是OOP的补充,提供了另一种关于程序结构的思路. OOP的模块化的关键单位是 类 . AOP的则是aspect切面. AOP 将程序的逻辑分成独立的块(叫 ...