openjdk
openjdk源码解析
一个努力的码农
这个作者很懒,什么都没留下…
展开
-
类文件解析006-解析接口
本文来介绍一下解析接口的部分,这部分的代码比较简单,算是为了给之后解析变量内容的减压.为了内容的连贯性,先来看一下class文件的格式:ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; --> 在调用ClassFileParser::...原创 2019-05-30 12:00:39 · 15326 阅读 · 0 评论 -
类文件解析005
之前的文章介绍了class文件解析常量池的步骤.其属于ClassFileParser::parseClassFile的核心步骤的第三步.本文介绍第4-6步.首先回顾一下ClassFileParser::parseClassFile的核心步骤:读取魔数并进行校验其是否为0xCAFEBABE读取class文件主,次版本号及验证,检查版本号支持是否支持,若不支持,则抛出java.lang....原创 2019-05-30 11:11:18 · 14677 阅读 · 0 评论 -
类文件解析004-解析常量池元素
我们在上篇文章介绍了创建constantPoolOop的过程,本文我们就来看看解析常量池元素的过程.这里涉及的方法为:ClassFileParser::parse_constant_pool_entries。代码如下:void ClassFileParser::parse_constant_pool_entries(constantPoolHandle cp, int length, TRAPS...原创 2019-05-29 14:53:08 · 14723 阅读 · 0 评论 -
类文件解析003-解析常量池
本文我们来介绍ClassFileParser 解析常量池的过程.解析常量池的过程是在ClassFileParser::parseClassFile 通过parse_constant_pool 来实现的.在parse_constant_pool 中的步骤如下:获得常量池的长度创建constantPoolOop调用parse_constant_pool_entries 解析常量池操作验证交...原创 2019-05-28 16:53:59 · 14817 阅读 · 0 评论 -
类文件解析002
上篇文章整体介绍了class文件解析的流程,本文就来介绍一下如下几个步骤:准备环节处理魔数读取class文件主,次版本号及验证,若不支持,则抛出java.lang.UnsupportedClassVersionError,检查该类文件是否需要放宽验证,不要将其限制为JDK1.0或JDK1.1以保持向后兼容性(4982376)–准备环节这部分是解析class文件的准备环节,是做些变量...原创 2019-05-27 19:18:21 · 14763 阅读 · 2 评论 -
类文件解析001
此处我们开始踏上类文件解析的道路.在此之前,我们已经讲解了类加载的流程,而在类加载的流程的过程中,涉及到类文件解析的过程,由于过程很复杂,因此用一个系列来进行介绍.(其实,在之前介绍的类加载的流程可以准确的).在此处贴下之前的博客目录:oop-klass内存模型类加载流程-01类加载流程-002类加载流程003类加载流程004类加载流程005类加载流程006解析此处先介绍一...原创 2019-05-27 15:29:53 · 14791 阅读 · 2 评论 -
类加载流程006
本文来介绍SystemDictionary::initialize(Thread* the_thread).在此之前,先介绍一下SystemDictionary涉及的类图:图中没有画出的是,SymbolPropertyTable,LoaderConstraintTable等,其内部存放的是SymbolPropertyEntry,LoaderConstraintEntry.解析SystemD...原创 2019-05-21 20:12:55 · 14884 阅读 · 3 评论 -
类加载流程005
在jvm初始化的时候,会调用Universe::genesis(Thread* the_thread),在该方法中,会创建一系列klassOop,这点在之前的博客中都有介绍.接下来,执行如下代码:vmSymbols::initialize(CHECK);SystemDictionary::initialize(CHECK); // 这里会创建java/lang/Object,java/la...原创 2019-05-21 16:03:35 · 14511 阅读 · 3 评论 -
类加载流程003
上篇文章讲解了klassKlass的创建过程,本文将Universe::genesis(TRAPS)方法中创建的klass已图的方式进行展示.注意,其创建的方式是一致的,不同的地方是大小不同等.以下先列举一下在该方法中创建的klass. klass名作用 klassKlassklass链路的末端 arrayKlassKlass是所有数组类类的抽象基类 objArrayKlassKlass...原创 2019-05-16 14:51:44 · 14646 阅读 · 1 评论 -
类加载流程004
之前的几篇文章介绍了一堆klass对象的创建,本文我们来介绍一下 基本数组的创建. 这个和之前介绍的创建有所不同.涉及到创建基本类型数组的代码如下:_boolArrayKlassObj = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK);_charArrayKlassObj = typeAr...原创 2019-05-17 14:10:51 · 13511 阅读 · 1 评论 -
类加载流程-002
本文让我们继续梳理类加载的流程,分析的代码为:_klassKlassObj = klassKlass::create_klass(CHECK);这里先说明2个问题:为啥要首先创建klassKlass?因为klassKlass 是klass链路的末端.不可能oop-klass 一直这么的指下去,必须有个终点.这个终点就是klassKlass.CHECK 是啥?...原创 2019-03-01 20:52:45 · 14971 阅读 · 0 评论 -
类加载流程-01
从本文开始讲述类加载过程,在这里先解释一下类加载的时机是什么?此时可以分为2种情况:主动引用被动引用类的主动引用指的是:new一个类的对象调用类的静态成员(除了final常量)和静态方法使用java.lang.reflect包的方法对类进行反射调用当虚拟机启动,java Demo01,则一定会初始化Demo01类,说白了就是先启动main方法所在的类当初始化一个类,如果其父...原创 2019-03-01 16:05:11 · 14818 阅读 · 0 评论 -
oop-klass内存模型
只要是对JVM有所了解的,或多或少的都知道oop-klass模型.那么什么是oop-klass模型?JVM内部基于oop-klass模型描述一个java类,将一个java类分为两个部分进行描述,其中第一个模型是oop,第二个模型是klass.接下来,本文从以下几个角度进行讲解:宏观: 从整体上描述一下oop-klass模型微观: 从类的继承结构上进行讲述,加深理解宏观JVM使用...原创 2019-03-01 16:02:33 · 16852 阅读 · 2 评论