专注虚拟机与编译器研究

2020年7月31日

第4.4篇-常量池解析(1)

摘要: 在调用ClassFileParser::parseClassFile()方法对类文件进行解释时,会调用ClassFileParser::parse_constant_pool()方法对常量池进行解释,调用的语句如下: constantPoolHandle cp = parse_constant_po 阅读全文

posted @ 2020-07-31 08:21 鸠摩(马智) 阅读(1223) 评论(0) 推荐(0) 编辑

第4.3篇-解析Class文件

摘要: 类文件解析的入口是ClassFileParser类中定义的parseClassFile()方法。上一小节得到了文件字节流stream后,接着会在ClassLoader::load_classfile()函数中调用parseClassFile()函数,调用的源代码实现如下: 源代码位置:src/sha 阅读全文

posted @ 2020-07-31 07:31 鸠摩(马智) 阅读(1295) 评论(0) 推荐(0) 编辑

2020年7月22日

第4.2篇-文件流

摘要: 在前一篇介绍ClassFileParser类时简单提了一下_stream属性,这个属性保存的是字节码文件流。如果要读取Class文件的内容,首先需要获取文件对应的字节流,ClassFileStream 内部维护了一个buffer,该buffer指向Class文件所对应的字节流。 ClassFileS 阅读全文

posted @ 2020-07-22 09:08 鸠摩(马智) 阅读(669) 评论(0) 推荐(0) 编辑

第4.1篇-类文件介绍

摘要: 之前在介绍类的双亲委派机制时,多次涉及到对ClassFileParser类中的parseClassFile()的调用。因为类的装载不仅仅是找到类对应的Class文件二进制流,更要解析出Class文件中包含的信息,将其转换为C/C++a56爆大奖在线娱乐方式,这样虚拟机在运行过程中才能更方便的进行操作。 在介绍par 阅读全文

posted @ 2020-07-22 06:44 鸠摩(马智) 阅读(731) 评论(0) 推荐(0) 编辑

2020年7月21日

第3.5篇-触发类的装载

摘要: 首先来介绍一下类加载的时机,下面5种情况会导致类初始化,a56爆大奖在线娱乐必然在此之前对类进行加载,如下: 当虚拟机启动时加载主类,之前已经详细介绍过主类的加载过程; 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类还没有初始化过,则需要进行初始化。 new一个类的对象,调用类的静态成 阅读全文

posted @ 2020-07-21 14:43 鸠摩(马智) 阅读(675) 评论(0) 推荐(0) 编辑

第3.4篇-Java主类的装载

摘要: 在之前介绍过HotSpot VM启动过程,在启动完成后会调用JavaMain()函数执行Java应用程序,也就是执行Java主类的main()方法,不过首先需要在JavaMain()函数(定义在openjdk/jdk/src/share/bin/java.c文件中)中调用LoadMainClass( 阅读全文

posted @ 2020-07-21 09:39 鸠摩(马智) 阅读(1091) 评论(0) 推荐(0) 编辑

2020年7月20日

第3.3篇-核心类的预装载

摘要: Universe::genesis()函数中有对数组及核心类的加载逻辑。数组类没有对应的Class文件,a56爆大奖在线娱乐在类加载阶段,基本类型的一维数组会被HotSpot VM直接创建,也不需要进行验证、准备和初始化等操作;类加载就是通过宏来定义一些需要加载的核心类,然后调用前面介绍的一些类加载器方法来加载类。 阅读全文

posted @ 2020-07-20 09:15 鸠摩(马智) 阅读(783) 评论(0) 推荐(0) 编辑

2020年7月19日

第3.2篇-类的双亲委派机制

摘要: 前面介绍了3种类加载器,每种类加载器都加载指定路径下的类库,它们在具体使用时并不是相互独立的,而是相互配合对类进行加载。另外如果有必要,还可以编写自定义的类加载器。这些类加载器的关系一般如下图所示。 需要提示的是,上图的各个类加载器之间并不a56爆大奖在线娱乐继承关系,而是a56爆大奖在线娱乐工作过程,具体说就是,对于一个加载类的 阅读全文

posted @ 2020-07-19 07:38 鸠摩(马智) 阅读(1403) 评论(3) 推荐(0) 编辑

2020年7月16日

第3.1篇-类加载器

摘要: 类加载器可以装载类,这些类被HotSpot VM装载后,都以InstanceKlass实例a56爆大奖在线娱乐(其实还可能是更具体的InstanceRefKlass、InstanceMirrorKlass或InstanceClassLoaderKlass实例)。涉及到主要的类加载器有启动类加载器/引导类加载器(Bo 阅读全文

posted @ 2020-07-16 09:31 鸠摩(马智) 阅读(1684) 评论(0) 推荐(1) 编辑

2020年7月15日

第2.8篇-句柄Handle的释放

摘要: 本篇首先介绍几个与句柄分配与释放密切相关的类,然后重点介绍句柄的释放。 1、HandleArea、Area与Chunk 句柄都是在HandleArea中分配并存储的。 HandleArea继承自CHeap,a56爆大奖在线娱乐是通过malloc()与free()函数在本地内存中分配内存。另外还有ResourceAr 阅读全文

posted @ 2020-07-15 07:27 鸠摩(马智) 阅读(2509) 评论(0) 推荐(1) 编辑

2020年7月14日

第2.7篇-操作句柄Handle

摘要: 可以将Handle理解成访问对象的一个“句柄”。垃圾回收时对象可能被移动(对象地址发生改变),通过Handle访问对象可以对使用者屏蔽垃圾回收细节,还能降低垃圾收集器查找GC Roots的复杂度,提高GC回收的效率。 Handle涉及到的相关类的继承关系如下图所示。 HotSpot VM会通过Han 阅读全文

posted @ 2020-07-14 07:36 鸠摩(马智) 阅读(1889) 评论(0) 推荐(0) 编辑

2020年7月13日

第2.6篇-HotSpot VM的对象模型(6)

摘要: 接着上一篇,a56爆大奖在线娱乐们继续来讲oopDesc相关的子类。 3、instanceOopDesc类 instanceOopDesc类的实例a56爆大奖在线娱乐除数组对象外的其它对象。在HotSpot VM中,对象在内存中存储的布局可以分为三块区域:对象头(header)、对象字段数据(field data)和对齐填充(pad 阅读全文

posted @ 2020-07-13 08:36 鸠摩(马智) 阅读(1242) 评论(0) 推荐(0) 编辑

2020年7月12日

第2.5篇-HotSpot的对象模型(5)

摘要: Java对象通过oop来a56爆大奖在线娱乐。在Java创建对象的时候创建,用于a56爆大奖在线娱乐对象的信息。也就是说,在Java应用程序运行中每创建一个Java对象,在HotSpot VM内部都会创建一个oop实例来a56爆大奖在线娱乐Java对象。 oop涉及到的相关类的继承关系如下图所示。 markOopDesc其实并不能a56爆大奖在线娱乐Java对象 阅读全文

posted @ 2020-07-12 20:22 鸠摩(马智) 阅读(1767) 评论(0) 推荐(0) 编辑

2020年7月2日

第1.3篇-HotSpot VM项目结构

摘要: 之前已经介绍了在Ubuntu 16.04上编译OpenJDK8的源代码和调试HotSpot VM源代码。这一章将介绍HotSpot VM项目的目录结构。 HotSpot VM目录下主要由agent、make、src和test这4个子目录构成。其中agent目录下包含了Serviceability A 阅读全文

posted @ 2020-07-02 06:54 鸠摩(马智) 阅读(1614) 评论(0) 推荐(0) 编辑

2019年11月28日

研究Java语言的编译器和虚拟机可参阅的资料

摘要: 现在使用Java语言的人很多,但是了解Java语言实现的人非常少。如果要研究Java语言的实现,推荐研究Javac和虚拟机HotSpot的源代码实现,其中Javac相当于Java编译的前端,HotSpot是Java语言运行的基础。弄懂了Javac与HotSpot,对Java语言也就达到了“精通”的地 阅读全文

posted @ 2019-11-28 19:28 鸠摩(马智) 阅读(1351) 评论(0) 推荐(1) 编辑

a56爆大奖在线娱乐的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了

摘要: 一个十足的技术迷,2013年毕业,做过ERP、游戏、计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书《深入解析Java编译器:源码剖析与实例详解》,在近期就会上市销售了。 1、为什么要写这本书? 从去年年底离职到今天7月交完《深入解析Java编译器:源码剖 阅读全文

posted @ 2019-11-28 15:04 鸠摩(马智) 阅读(3120) 评论(1) 推荐(3) 编辑

2019年6月3日

研究小技巧及专业术语

摘要: 1、在Linux命令行中以图形化窗口打开文件夹 nautilus /home/testProjects/ 2、截图使用 PrintScreen,如果是部分截图,则为Shift+PrintScreen 3、alt+ctrl+t 快速打开ubuntu的终端 4、Mac下的截图操作分别为COMMAND+S 阅读全文

posted @ 2019-06-03 15:13 鸠摩(马智) 阅读(653) 评论(0) 推荐(0) 编辑

导航