![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
kvm
一个努力的码农
这个作者很懒,什么都没留下…
展开
-
kvm线程-004-线程切换
本文介绍kvm中线程切换的实现.通过kvm线程-001的介绍.可以得到如下事实:对于通过new Thread() 创建的线程,其分配的时间片为:priority * 1000.其代码如下: void Java_java_lang_Thread_setPriority0(void){ int priority = popStack(); THREAD VMthrea...原创 2019-07-23 15:32:48 · 5258 阅读 · 1 评论 -
kvm终止流程
本文介绍KVM的终止流程.其是在StartJVM方法中调用的.代码如下:int StartJVM(int argc, char* argv[]){ volatile int returnValue = 0; /* Ensure that we have a class to run 必须提供要运行的类名 */ if (argc <= 0 || argv[0] =...原创 2019-07-12 11:39:00 · 3948 阅读 · 1 评论 -
kvm垃圾收集-003
本文介绍在kvm中垃圾收集的实际实现,其方法名为garbageCollectForReal.其代码如下:voidgarbageCollectForReal(int realSize){ CHUNK firstFreeChunk; long maximumFreeSize; /* The actual high-level GC algorithm is here *...原创 2019-07-18 17:44:11 · 5361 阅读 · 0 评论 -
kvm垃圾收集-002
本文我们来介绍kvm中的垃圾收集器的实现.其算法为mark-and-sweep(含有压缩功能).其方法为garbageCollect.代码如下:voidgarbageCollect(int moreMemory){#if INCLUDEDEBUGCODE int beforeCollection = 0; int afterCollection = 0;#endif ...原创 2019-07-18 11:41:37 · 5491 阅读 · 0 评论 -
kvm-inlineCache
本文来详细介绍kvm中的inlineCache.其定义如下:struct icacheStruct { cell* contents; /* 指向实际要执行方法 */ BYTE* codeLoc; /* 指向引用内联缓存项的代码位置*/ short origParam; /* 原始字节码的参数,其值= codeLoc+1 */ BYTE orig...原创 2019-07-11 12:12:12 · 4788 阅读 · 0 评论 -
kvm对象头
在之前的文章中,简要说了一下kvm中的对象头,kvm中的对象头和jvm中的不完全相同.本文进行详细介绍.在我们的VM中,内存中的每个堆分配结构前面都有一个对象头,它提供关于对象类型和大小的详细信息。头的长度是一个字(32位)。如图:这里有一定注意的是,在kvm中是没有对象句柄。因此,与许多其他JVM实现(openjdk)不同,所有内存引用都是直接的,而不是间接的。对象头出于管理目的,其是...原创 2019-07-15 16:45:55 · 5445 阅读 · 0 评论 -
kvm启动流程-005
写在前面这是本人的第100篇博文,随着不断的看源码,不知不觉已有这么多…前言kvm在启动时的步骤如下:创建ROM镜像,此处为宏,定义在j2me_cldc/kvm/VmCommon/h/garbage.h初始化FPU初始化异步I/0系统初始化本地代码初始化vm,此处为宏,定义在j2me_cldc/kvm/VmUnix/h/machine_md.h初始化全局变量初始化性能统计的变...原创 2019-07-05 15:32:19 · 5087 阅读 · 0 评论 -
kvm启动流程-004
本文介绍kvm启动过程中的初始化class-path table,初始化VM所需要的内部类.初始化class-path table此处的代码如下:void InitializeClassLoading(){ char *classpath = UserClassPath; int length, pathCount, i; int tableIndex; ...原创 2019-07-05 12:31:49 · 4972 阅读 · 0 评论 -
kvm启动流程-003
kvm在启动时的步骤如下:创建ROM镜像,此处为宏,定义在j2me_cldc/kvm/VmCommon/h/garbage.h初始化FPU初始化异步I/0系统初始化本地代码初始化vm,此处为宏,定义在j2me_cldc/kvm/VmUnix/h/machine_md.h初始化全局变量初始化性能统计的变量,定义在 j2me_cldc/kvm/VmCommon/h/profiling....原创 2019-07-05 12:04:03 · 5109 阅读 · 0 评论 -
kvm解释器-004
本文介绍主类main方法执行的过程.其字节码如下:另外,此处主类反编译后的结果如下:# 参数 hejiarui$ javap -v -l -p -c -s -constants KVMTest.class Classfile KVMTest.class Last modified Jul 8, 2019; size 415 bytes MD5 checksum be7ceda6878...原创 2019-07-10 17:00:33 · 4757 阅读 · 0 评论 -
kvm解释器-003
本文继续介绍kvm中解释执行的步骤.接上文,目前栈中的情况如图所示:初始化Thread此处初始化的步骤和上文中介绍的一样,也是调用runClinit方法.首先设置初始化线程为CurrentThread,然后由于其父类Object此时的状态为CLASS_READY,因此就不需要初始化父类了.此处的代码如下:if ((thisClass->clazz.accessFlags & ...原创 2019-07-10 16:58:40 · 4794 阅读 · 0 评论 -
kvm垃圾收集-004
本文介绍garbageCollectForReal方法中的第二步–markNonRootObjects.该方法的功能是扫描堆中存活对象,将其所引用的对象标记为存活.该方法使用了尾递归的方式扫描整个堆.同时为了防止递归次数过多,设置了阀值.最多递归次数为MAX_GC_DEPTH(4).这样,不管对象多少,则一定会处理完毕的.markNonRootObjects的代码如下:static voi...原创 2019-07-18 20:38:33 · 5323 阅读 · 0 评论 -
kvm free chunk list
在kvm内部中在分配内饰时使用了free chunk list.其定义如下:struct chunkStruct { long size; /* 当前chunk的大小,不包含该字段 */ CHUNK next; /* 指向下一个chunk */};如图所示:这里需要注意的是:size使用与常规对象头相同的格式存储,但是只使用最高的24位(见...原创 2019-07-16 18:07:25 · 5486 阅读 · 0 评论 -
kvm垃圾收集-005
本文介绍garbageCollectForReal中的第3步–markWeakPointerLists,第4步–markWeakReferences.markWeakPointerLists其代码如下:static voidmarkWeakPointerLists(){ WEAKPOINTERLIST list; /* 1. 保存本地方法指针 */ cell* ...原创 2019-07-19 11:34:46 · 5336 阅读 · 0 评论 -
kvm线程-003
本文介绍kvm中关于线程操作中的下列函数:registerAlarmcheckTimerQueueremovePendingAlarm这三个函数,涉及到了一个队列–TimerQueue.其定义如下:THREAD TimerQueue;typedef struct threadQueue* THREAD;而threadQueue(说是queue,其数据结构上是用链表...原创 2019-07-22 18:27:52 · 5258 阅读 · 0 评论 -
kvm线程-002
kvm在内部定义了很多方法来操作线程,如下:/* 线程的构造 */void InitializeThreading(INSTANCE_CLASS, ARRAY);THREAD getVMthread(JAVATHREAD_HANDLE);/* 线程操作 */void initThreadBehavior(THREAD, METHOD, OBJECT);void...原创 2019-07-22 16:24:16 · 5353 阅读 · 0 评论 -
kvm线程-001
KVM具有独立于机器的、可移植的线程模型,可以独立于Java语言运行.其变化如下:1.0之前使用了一个简单的循环调度模型,其中系统中的所有活动线程都存储在循环列表中.列表中的线程根据每个任务的Java级优先级,一个接一个地执行。在实现级别,线程优先级只是一个整数,它告诉解释器在下一个线程切换发生之前,线程可以执行多少原语。在每个字节码执行之后,线程的“Timeslice”计数器将递减。当时...原创 2019-07-22 14:56:17 · 5346 阅读 · 0 评论 -
kvm垃圾收集-008-更新对象引用
本文介绍在压缩内存后更新对象引用的代码,这部分的代码如下:// 修改指针updateRootObjects(¤tTable);updateHeapObjects(¤tTable, freeStart);其中updateRootObjects的代码如下:static voidupdateRootObjects(breakTableStruct *...原创 2019-07-22 10:50:27 · 5158 阅读 · 0 评论 -
kvm垃圾收集-压缩算法实现,独家
本文介绍kvm中垃圾收集算法中的压缩部分.这里涉及到BreakTable 这么一个数据结构,BreakTable的每个表项对应于在garbage collector进行compating的过程中每个被移动了的object,每个表项含有两个字段,其中address表示该项对应的object被移动前在内存中的起始地址,offset表示该object在compacting过程中相对于原地址移动的偏移量...原创 2019-07-22 10:15:29 · 5274 阅读 · 0 评论 -
kvm线程-007-线程状态-THREAD_SUSPENDED,THREAD_DEAD
本文介绍线程状态THREAD_SUSPENDED,THREAD_DEAD的使用。THREAD_SUSPENDE该状态设置的地方为:startThread,该方法在kvm线程-006-线程状态-THREAD_ACTIVE 中有介绍suspendThread,该方法的代码如下:void suspendThread(void){ // 1. 如果CurrentThread 为null...原创 2019-07-25 16:41:33 · 5476 阅读 · 1 评论 -
kvm线程-006-线程状态-THREAD_ACTIVE
本文介绍线程状态THREAD_ACTIVE的使用.设置线程状态THREAD_ACTIVE的地方有:InitializeThreading,这点在kvm启动流程-006 中有详细介绍.resumeThread,其代码如下: void resumeThread(THREAD thisThread) { // 如果状态不是THREAD_SUSPENDED,则抛出异常...原创 2019-07-25 14:47:39 · 5297 阅读 · 0 评论 -
kvm线程-005-线程状态-THREAD_JUST_BORN
在kvm内部定义了线程状态,如下: enum { THREAD_JUST_BORN = 1, /* 还没有启动*/ THREAD_ACTIVE = 2, /* 当前正在运行,或者在等待运行的队列中*/ THREAD_SUSPENDED = 4, /* 等待monitor或者alarm */ THR...原创 2019-07-25 11:00:45 · 5374 阅读 · 0 评论 -
kvm 本地方法实现
本文介绍kvm中本地方法的实现.在j2me_cldc/kvm/VmCommon/h/native.h中有如下定义:typedef void NativeFunctionType(void);typedef NativeFunctionType *NativeFunctionPtr; // 函数指针typedef struct { const char *const name; /...原创 2019-07-24 18:44:52 · 5291 阅读 · 0 评论 -
kvm垃圾收集-006
本文介绍kvm中垃圾收集中的sweep.sweep的意思是: 将垃圾对象清除(其实垃圾区域的对象还是存在的,但是由于没有对象引用,同时之后在分配对象时,会在这些区域分配,分配时会进行清零操作.因此,也就表现为实际清除了一样)。此处的代码如下:static CHUNKsweepTheHeap(long *maximumFreeSizeP){ CHUNK firstFreeChunk =...原创 2019-07-19 11:49:41 · 5311 阅读 · 0 评论 -
kvm启动流程-002
本文介绍初始化内存系统的代码.该方法定义如下:void InitializeMemoryManagement(void){ int index; gcInProgress = 0;// 是否gc在执行过程中 InitializeHeap(); // 1.初始化堆 // 2.初始化root index = 0; GlobalRoots[index...原创 2019-07-05 09:57:44 · 4957 阅读 · 0 评论 -
kvm解释器-002
在JAVA虚拟机规范(JAVA SE 7 )中,针对初始化的过程有如下的定义:每个类或接口C,都有一个唯一的初始化锁LC。如何实现从C到LC的映射可由Java虚拟机实现自行决定。例如,LC可以是C的Class对象,或者是与Class对象相关的管程(Monitor)。初始化C的过程如下:同步C的初始化锁LC。这个操作会导致当前线程一直等待直到可以获得LC锁如果C的Class对象显示当前C的初...原创 2019-07-09 16:04:09 · 4820 阅读 · 0 评论 -
kvm解释器-001
从本文开始接受kvm中解释器是如何执行的流程.以一个例子来进行说明,如下:public class KVMTest{ public static void main(String[] args){ System.out.println("success"); } }javap后,其结果如下:# 命令行为: javap -v -l -p -c ...原创 2019-07-09 16:01:38 · 5009 阅读 · 2 评论 -
kvm类加载-001
开篇在JVM中,类加载的过程如图所示:加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象。连接,连接又包含三块内容:验证、准备、初始化。验证,文件格式、元数据、字节码、符号引用验证;准备,为类的静态变量分配内存,并将其初始化为默认值;解析,把类中的符号引用转换为直接引用初始化,为类的静态变量赋予正确的初始值。而在kvm的实现...原创 2019-07-01 17:48:09 · 5110 阅读 · 2 评论 -
kvm目录结构
kvm介绍此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解下载可以到:下载地址在同意许可证后就可以下载到CLDC 1.1的参考实现源码了。文件名是:j2me_cldc-1_1...原创 2019-07-01 17:46:35 · 5638 阅读 · 0 评论 -
kvm文档翻译-第九章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解64位支持我们不要求编...翻译 2019-06-18 11:11:58 · 5403 阅读 · 0 评论 -
kvm文档翻译-第八章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解类加载, JAR文件,解...翻译 2019-06-17 16:23:47 · 5405 阅读 · 0 评论 -
kvm文档翻译-第七章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解虚拟机启动在不同的KV...翻译 2019-06-17 14:36:44 · 5371 阅读 · 0 评论 -
kvm文档翻译-第六章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解编译选项,宏本节列出了...翻译 2019-06-17 13:14:08 · 5517 阅读 · 0 评论 -
kvm文档翻译-第五章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解目录结构概览将发布包...翻译 2019-06-14 17:38:35 · 5569 阅读 · 0 评论 -
kvm文档翻译-第四章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解移植到特定平台所需的特定...翻译 2019-06-14 14:39:41 · 5643 阅读 · 2 评论 -
kvm文档翻译-第三章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解编译要求为了能够编译k...翻译 2019-06-13 15:31:09 · 5526 阅读 · 0 评论 -
kvm文档翻译-第二章
说明翻译KVM的文档,只是为了个人学习以做记录.如果有翻译不周到的地方,请指出,我会修正的.为何翻译该文档此KVM不是目前特别火的Kernel-based Virtual Machine(一个开源的系统虚拟化模块).而是一个JAVA 的虚拟机.是J2ME cldc 的一个实现.其源码的难度比hotspot简单多了.因此,想通过研读KVM,以加深对hotspot的理解KVM简介KVMKV...翻译 2019-06-13 14:53:35 · 5599 阅读 · 0 评论 -
kvm类加载-002
本文介绍加载过程,在上文中类加载的准备环节。接下来,就会调用loadClassfile方法.将指定的类加载到kvm中,并且进行链接。注意,在load和link的过程中,是向上回溯进行的.解析load 涉及的代码如下: volatile INSTANCE_CLASS clazz = InitiatingClass; /* * 如果class的状态不是CLASS_RAW,...原创 2019-07-01 17:49:45 · 3957 阅读 · 0 评论 -
kvm类加载-003
这里再贴一下, loadRawClass 方法的步骤:打开对应的class文件加载版本号加载常量池 <— 本文讲解该步骤.加载类的标识符加载接口加载字段加载方法加载类的属性关闭流常量池的数据结构常量池定义如下:struct constantPoolStruct { union constantPoolEntryStruct entries[1];...原创 2019-07-01 17:51:25 · 4947 阅读 · 0 评论 -
kvm类加载-004
这里再贴一下, loadRawClass 方法的步骤:打开对应的class文件加载版本号加载常量池加载类的标识符 <— 本文讲解该步骤.加载接口 <— 本文讲解该步骤.加载字段加载方法加载类的属性关闭流加载类的标识符在jvm规范中,支持的access_flags,如图:带有ACC_SYNTHETIC标志的类,意味着它是由编译器自己产生的而不是由程序员编写...原创 2019-07-01 17:53:17 · 4965 阅读 · 0 评论