openjdk
一个努力的码农
这个作者很懒,什么都没留下…
展开
-
jdk中gamma启动器脚本详解
解析本文是基于jdk1.6进行解析的,在HotSpot中存在两种启动器,一种是通用启动器(java/javaw),另一种是调试版启动器(gamma).在对openjdk编译后,会在jvmg 目录下生成hotSpot脚本,这个启动器入口位于hotspot/src/share/tools/luncher/java.c. 本文就来看一下该脚本#解析该脚本中首先是设置gdb,dbx,valgrin...原创 2018-11-13 17:59:34 · 6458 阅读 · 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 · 14737 阅读 · 0 评论 -
类文件解析003-解析常量池
本文我们来介绍ClassFileParser 解析常量池的过程.解析常量池的过程是在ClassFileParser::parseClassFile 通过parse_constant_pool 来实现的.在parse_constant_pool 中的步骤如下:获得常量池的长度创建constantPoolOop调用parse_constant_pool_entries 解析常量池操作验证交...原创 2019-05-28 16:53:59 · 14831 阅读 · 0 评论 -
类文件解析002
上篇文章整体介绍了class文件解析的流程,本文就来介绍一下如下几个步骤:准备环节处理魔数读取class文件主,次版本号及验证,若不支持,则抛出java.lang.UnsupportedClassVersionError,检查该类文件是否需要放宽验证,不要将其限制为JDK1.0或JDK1.1以保持向后兼容性(4982376)–准备环节这部分是解析class文件的准备环节,是做些变量...原创 2019-05-27 19:18:21 · 14768 阅读 · 2 评论 -
类文件解析006-解析接口
本文来介绍一下解析接口的部分,这部分的代码比较简单,算是为了给之后解析变量内容的减压.为了内容的连贯性,先来看一下class文件的格式:ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; --> 在调用ClassFileParser::...原创 2019-05-30 12:00:39 · 15338 阅读 · 0 评论 -
类文件解析005
之前的文章介绍了class文件解析常量池的步骤.其属于ClassFileParser::parseClassFile的核心步骤的第三步.本文介绍第4-6步.首先回顾一下ClassFileParser::parseClassFile的核心步骤:读取魔数并进行校验其是否为0xCAFEBABE读取class文件主,次版本号及验证,检查版本号支持是否支持,若不支持,则抛出java.lang....原创 2019-05-30 11:11:18 · 14689 阅读 · 0 评论 -
类文件解析001
此处我们开始踏上类文件解析的道路.在此之前,我们已经讲解了类加载的流程,而在类加载的流程的过程中,涉及到类文件解析的过程,由于过程很复杂,因此用一个系列来进行介绍.(其实,在之前介绍的类加载的流程可以准确的).在此处贴下之前的博客目录:oop-klass内存模型类加载流程-01类加载流程-002类加载流程003类加载流程004类加载流程005类加载流程006解析此处先介绍一...原创 2019-05-27 15:29:53 · 14800 阅读 · 2 评论 -
类加载流程003
上篇文章讲解了klassKlass的创建过程,本文将Universe::genesis(TRAPS)方法中创建的klass已图的方式进行展示.注意,其创建的方式是一致的,不同的地方是大小不同等.以下先列举一下在该方法中创建的klass. klass名作用 klassKlassklass链路的末端 arrayKlassKlass是所有数组类类的抽象基类 objArrayKlassKlass...原创 2019-05-16 14:51:44 · 14656 阅读 · 1 评论 -
类加载流程004
之前的几篇文章介绍了一堆klass对象的创建,本文我们来介绍一下 基本数组的创建. 这个和之前介绍的创建有所不同.涉及到创建基本类型数组的代码如下:_boolArrayKlassObj = typeArrayKlass::create_klass(T_BOOLEAN, sizeof(jboolean), CHECK);_charArrayKlassObj = typeAr...原创 2019-05-17 14:10:51 · 13521 阅读 · 1 评论 -
类加载流程006
本文来介绍SystemDictionary::initialize(Thread* the_thread).在此之前,先介绍一下SystemDictionary涉及的类图:图中没有画出的是,SymbolPropertyTable,LoaderConstraintTable等,其内部存放的是SymbolPropertyEntry,LoaderConstraintEntry.解析SystemD...原创 2019-05-21 20:12:55 · 14901 阅读 · 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 · 14518 阅读 · 3 评论 -
类加载流程-002
本文让我们继续梳理类加载的流程,分析的代码为:_klassKlassObj = klassKlass::create_klass(CHECK);这里先说明2个问题:为啥要首先创建klassKlass?因为klassKlass 是klass链路的末端.不可能oop-klass 一直这么的指下去,必须有个终点.这个终点就是klassKlass.CHECK 是啥?...原创 2019-03-01 20:52:45 · 14981 阅读 · 0 评论 -
类加载流程-01
从本文开始讲述类加载过程,在这里先解释一下类加载的时机是什么?此时可以分为2种情况:主动引用被动引用类的主动引用指的是:new一个类的对象调用类的静态成员(除了final常量)和静态方法使用java.lang.reflect包的方法对类进行反射调用当虚拟机启动,java Demo01,则一定会初始化Demo01类,说白了就是先启动main方法所在的类当初始化一个类,如果其父...原创 2019-03-01 16:05:11 · 14831 阅读 · 0 评论 -
oop-klass内存模型
只要是对JVM有所了解的,或多或少的都知道oop-klass模型.那么什么是oop-klass模型?JVM内部基于oop-klass模型描述一个java类,将一个java类分为两个部分进行描述,其中第一个模型是oop,第二个模型是klass.接下来,本文从以下几个角度进行讲解:宏观: 从整体上描述一下oop-klass模型微观: 从类的继承结构上进行讲述,加深理解宏观JVM使用...原创 2019-03-01 16:02:33 · 16874 阅读 · 2 评论 -
kvm垃圾收集-001
kvm中的垃圾收集算法是基于Cheney的elegant copying collector而来.尽管该收集器有很多好处(特别是,它使用迭代而不是递归算法来收集对象).但它有复制收集器的一般问题,因为它需要比程序实际使用的内存空间多一倍的内存空间。当将KVM移植到内存非常有限的设备(如PalmPilot)上运行时,这一要求是有问题的。为了使kvm更适合小型设备,针对kvm 1.0实现了一种新的垃...原创 2019-07-12 19:20:25 · 5597 阅读 · 0 评论