klassVtable与klassItable】的更多相关文章

klassVtable与klassItable类用来实现Java方法的多态,也可以叫动态绑定,是指在应用执行期间通过判断接受对象的实际类型,根据实际类型调用对应的方法.C++为了实现多态,在对象中嵌入了虚函数表vtable,通过虚函数表来实现运行期的方法分派,这在之前介绍HotSpot的二分模型时简单介绍过,这里不再介绍C++的方法分派. 1.klassVtable类 C++中的vtable只包含虚函数,非虚函数在编译期就已经解析出正确的方法调用了.Java vtable除了虚方法外还包含了其他…
在ClassFileParser::parseClassFile()函数中会计算vtable和itable所需要的大小,因为vtable和itable是内嵌在Klass中的,parseClassFile()函数解析完Class文件后会创建instanceKlass来保存相关的信息,在创建instanceKlass时需要知道创建对象的大小,所以必须要把vtable和itable也计算出来.下面就来介绍一下vtable和itable大小的计算过程,这一篇只介绍vtable大小的计算过程,下一篇将介绍…
在ClassFileParser::parseClassFile()函数中计算vtable和itable所需要的大小,之前已经介绍过vtable大小的计算,这一篇将详细介绍itable大小的计算过程.调用语句如下: // Size of Java itable (in words) if( access_flags.is_interface() ){ itable_size = 0 ; // 当为接口时,itable_size为0 }else{ itable_size = klassItable…
ClassFileParser::parseClassFile()方法会将解析Class文件的大部分结果保存到instanceKlass对象中.创建instanceKlass对象的代码如下: int total_oop_map_size2 = InstanceKlass::nonstatic_oop_map_size(info.total_oop_map_count); // ReferenceType是枚举类,定义如下: /*enum ReferenceType { REF_NONE, //…
在InstanceKlass::link_class_impl()方法中完成方法连接后会继续初始化vtable与itable,之前已经介绍过vtable与itable,并且在类解析过程中已经完成了大小的计算并且也为相关信息的存储开辟了对应的内存空间,也就是在InstanceKlass本身需要占用的内存空间之后紧接着存储vtable,vtable后接着存储itable. InstanceKlass::link_class_impl()方法中相关的调用语句如下: if (!this_oop()->i…
在InstanceKlass::link_class_impl()方法中完成方法连接后会继续初始化vtable与itable,之前已经介绍过vtable与itable,并且在类解析过程中已经完成了大小的计算并且也为相关信息的存储开辟了对应的内存空间,也就是在InstanceKlass本身需要占用的内存空间之后紧接着存储vtable,vtable后接着存储itable.这一篇将介绍itable的初始化.在InstanceKlass::link_class_impl()方法中的调用语句如下: kla…
之前多次提到接触到调用JavaCalls::call()方法来执行Java方法,如: (1)Java主类装载时,调用JavaCalls::call()方法执行的Java方法checkAndLoadMain()方法 (2)类的初始化过程中,调用JavaCalls::call()方法执行的Java方法<clinit>方法 可以看出,JavaCalls::call()方法为虚拟机调用Java方法提供了便利,Java虚拟机有invokestatic.invokedynamic.invokestatic…
Java使用SoftReference来表示软引用,软引用是用来描述一些“还有用但是非必须”的对象.对于软引用关联着的对象,在JVM应用即将发生内存溢出异常之前,将会把这些软引用关联的对象列进去回收对象范围之中进行第二次回收.如果这次回收之后还是没有足够的内存,才会抛出内存溢出异常.简单来说就是: 如果内存空间足够,垃圾回收器就不会回收软引用关联着的对象. 如果内存空间不足,垃圾回收器在将要抛出内存溢出异常之前会回收软引用关联着的对象. 后面会详细介绍关于内存空间的计算方式. 下面是软引用类及重…
下面接着上一篇介绍第2阶段和第3阶段的处理逻辑. 2.process_phase2() 第2个阶段移除所有的referent还存活的Reference,也就是从refs_list中移除Reference.process_phase2()方法的实现如下: // Phase2: remove all those references whose referents are reachable. inline void process_phase2(DiscoveredList& refs_list,…
这一篇将介绍弱引用和幻像引用. 1.WeakReference WeakReference也就是弱引用,弱引用和软引用类似,它是用来描述"非必须"的对象的,它的强度比软引用要更弱一些.被弱引用关联的对象只能生存到下一次垃圾收集发生之前,简言之就是:一旦发生GC必定回收被弱引用关联的对象,不管当前的内存是否足够.WeakReference类的定义如下: public class WeakReference<T> extends Reference<T> { pub…
FinalReference类只有一个子类Finalizer,并且Finalizer由关键字final修饰,所以无法继承扩展.类的定义如下: class FinalReference<T> extends Reference<T> { public FinalReference(T referent, ReferenceQueue<? super T> q) { super(referent, q); } } FinalReference是包权限,开发者无法直接进行继承…
接着上一篇去讲,回到JavaCalls::call_helper()中: address entry_point = method->from_interpreted_entry(); entry_point是从当前要执行的Java方法中获取的,定义如下: 源代码位置:/openjdk/hotspot/src/share/vm/oops/method.hpp volatile address from_interpreted_entry() const{ return (address)Orde…
Java的模板解析执行需要模板表与转发表的支持,而这2个表中的数据在HotSpot虚拟机启动时就会初始化.这一篇首先介绍模板表. 在启动虚拟机阶段会调用init_globals()方法初始化全局模块,在这个方法中通过调用interpreter_init()方法初始化模板解释器,调用栈如下: TemplateInterpreter::initialize() templateInterpreter.cpp interpreter_init() interpreter.cpp init_global…
在从generate_normal_entry()函数调用generate_fixed_frame()函数时的栈与寄存器的状态如下: 栈的状态如下图所示. 各个寄存器的状态如下所示. rax: return address // %rax寄存器中存储的是返回地址r rbx: Method* // 要执行的Java方法的指针 r14: pointer to locals // 本地变量表指针 r13: sender sp // 调用者的栈顶 调用的generate_fixed_frame()方法的…
之前的文章介绍到,在generate_normal_entry()函数中会调用generate_fixed_frame()函数为Java方法的执行生成对应的栈帧,接下来还会调用dispatch_next()函数执行Java方法的字节码.generate_normal_entry()函数中调用的dispatch_next()函数的实现如下: // 从generate_fixed_frame()函数生成固定桢的时候,如果当前是第一次调用, // 那么r13指向的是字节码的首地址,即第一个字节码,而s…
在解释执行的情况下需要一些类来支持代码生成的过程. 1.InterpreterCodelet与Stub类 Stub类的定义如下: class Stub VALUE_OBJ_CLASS_SPEC { public: // General info/converters int size() const { ShouldNotCallThis(); return 0; } // must return the size provided by initialize // Code info addr…
今天我们来聊聊如何跟Unity学代码优化,准确地说,是通过学习Unity的IL2CPP技术的优化策略,应用到我们的日常逻辑开发中. 做过Unity开发的同学想必对IL2CPP都很清楚,简单地说,IL2CPP就是Unity用来替代mono的一种script backend.至于说Unity为什么用IL2CPP替代mono,就是另外的话题了,本文就不细港了. IL2CPP由两部分组成: 一个AOT(ahead of time)compiler.完全用C#写的. 一个VM runtime librar…
工具与环境:Windows 7 x64企业版Cygwin x64jdk1.8.0_162 openjdk-8u40-src-b25-10_feb_2015Vs2010 professional 0x00: Java多态简单介绍 1.多态的概念: JAVA类被jvm加载运行时根据调用该方法的对像实例的类型来决定选择调用哪个方法则被称为运行时多态.也叫动态绑定:是指在执行期间判断所引用对象实例的实际类型,根据其实际的类型调用其相应的方法. 2.多态的优点: a.可替换性: 多态对已存在代码具有可替换…
上一篇分析了 HotSpot类模型之InstanceKlass ,这次主要分析表示java数组类型的C++类. 1.ArrayKlass类 ArrayKlass继承自Klass,是所有数组类的抽象基类,类及重要属性的定义如下: class ArrayKlass: public Klass { ... private: int _dimension; // This is n'th-dimensional array. Klass* volatile _higher_dimension; // R…