归去来兮

2020年8月8日

[置顶] 使用HSDB查看类变量的内存布局(5)

摘要:如下的实例来自Hotspot 垃圾回收之oop_iterate(一) 源码解析,我做了一些微小的改动。 查看如下实例的内存布局: package com.test; public class Parent { private Integer a = 1; protected long b = 2; 阅读全文

posted @ 2020-08-08 07:11 HotSpot-Researcher 阅读(13) 评论(0) 推荐(0) 编辑

2020年7月22日

[置顶] 文件流

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

posted @ 2020-07-22 09:08 HotSpot-Researcher 阅读(12) 评论(0) 推荐(0) 编辑

[置顶] 类文件介绍

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

posted @ 2020-07-22 06:44 HotSpot-Researcher 阅读(13) 评论(0) 推荐(0) 编辑

2020年8月11日

类的连接之重写(1)

摘要:调用InstanceKlass类的rewrite_class()函数重写字节码,实现如下: // Rewrite the byte codes of all of the methods of a class. // The rewriter must be called exactly once. 阅读全文

posted @ 2020-08-11 11:35 HotSpot-Researcher 阅读(6) 评论(0) 推荐(0) 编辑

类的连接之验证

摘要:在介绍字节码连接之前,有必要介绍一下字节码验证。HotSpot虚拟机其实会遵守《Java虚拟机规范》,对Class文件中包含的信息进行合法性验证,以保证虚拟机的安全。从整体上来看,验证阶段大致上会进行如下4方面的验证: 文件格式验证:包括魔数,版本号等; 元数据验证:对程序进行语义分析,如是否有父类 阅读全文

posted @ 2020-08-11 09:12 HotSpot-Researcher 阅读(5) 评论(0) 推荐(0) 编辑

类的连接

摘要:在类的连接之前要保证对类进行了解析,例如初始化一个类时会调用initialize_class()方法,实现如下: static void initialize_class(Symbol* class_name, TRAPS) { Klass* klass = SystemDictionary::re 阅读全文

posted @ 2020-08-11 08:39 HotSpot-Researcher 阅读(10) 评论(0) 推荐(0) 编辑

2020年8月10日

字段解析之字段注入

摘要:之前已经介绍过字段解析,不过由于我的疏忽,丢了一部分不得不介绍的内容,那就是字段注入。举个例子如下: package jvmTest; import java.lang.management.ManagementFactory; import java.lang.management.Runtime 阅读全文

posted @ 2020-08-10 16:29 HotSpot-Researcher 阅读(8) 评论(0) 推荐(0) 编辑

解析Class文件之创建InstanceKlass对象

摘要:ClassFileParser::parseClassFile()方法会将解析Class文件的大部分结果保存到instanceKlass对象中。创建instanceKlass对象的代码如下: int total_oop_map_size2 = InstanceKlass::nonstatic_oop 阅读全文

posted @ 2020-08-10 16:28 HotSpot-Researcher 阅读(15) 评论(0) 推荐(0) 编辑

2020年8月9日

计算itable的大小

摘要:在ClassFileParser::parseClassFile()函数中计算vtable和itable所需要的大小,之前已经介绍过vtable大小的计算,这一篇将详细介绍itable大小的计算过程。调用语句如下: // Size of Java itable (in words) if( acce 阅读全文

posted @ 2020-08-09 15:29 HotSpot-Researcher 阅读(8) 评论(0) 推荐(0) 编辑

计算vtable的大小

摘要:在ClassFileParser::parseClassFile()函数中会计算vtable和itable所需要的大小,因为vtable和itable是内嵌在Klass中的,parseClassFile()函数解析完Class文件后会创建instanceKlass来保存相关的信息,在创建instan 阅读全文

posted @ 2020-08-09 15:28 HotSpot-Researcher 阅读(19) 评论(0) 推荐(0) 编辑

2020年8月8日

klassVtable与klassItable类的介绍

摘要:klassVtable与klassItable类用来实现Java方法的多态,也可以叫动态绑定,是指在应用执行期间通过判断接受对象的实际类型,根据实际类型调用对应的方法。C++为了实现多态,在对象中嵌入了虚函数表vtable,通过虚函数表来实现运行期的方法分派,这在之前介绍HotSpot的二分模型时简 阅读全文

posted @ 2020-08-08 10:17 HotSpot-Researcher 阅读(55) 评论(0) 推荐(0) 编辑

方法解析

摘要:在ClassFileParser::parseClassFile()函数中解析完字段并完成每个字段的布局后,会继续对方法进行解析,相关的处理语句如下: bool has_final_method = false; AccessFlags promoted_flags; promoted_flags. 阅读全文

posted @ 2020-08-08 09:35 HotSpot-Researcher 阅读(9) 评论(0) 推荐(0) 编辑

方法解析之Method与ConstMethod介绍

摘要:HotSpot通过Method与ConstMethod来保存方法元信息。 1、Method Method没有子类,定义在method.hpp文件中,其类继承关系如下图: Method用于表示一个Java方法,因为一个应用有成千上万个方法,因此保证Method类在内存中短小非常有必要。为了本地GC方便 阅读全文

posted @ 2020-08-08 07:39 HotSpot-Researcher 阅读(16) 评论(0) 推荐(0) 编辑

导航

统计