Java Virtual Machine (JVM) 就是一个非常成功的例子。JVM 本身是一个中等大小、程序员完全能够看懂的程序,因此很 容易将它移植到包括手机在内的上千种设备上。只要在设备上实现了 JVM,接下来任何 Java、Kotlin 或 Clojure 程序都无需任何修改就可以直接运行在这个设备上。唯一的开销 来自虚拟机自身以及机器之上的 ...
使用C语言实现JVM 首先,我们需要定义一些基本的数据结构,例如Java虚拟机栈、局部变量表等。然后,我们编写一个简单的解释器,用于解释执行Java字节码。 typedefstruct{int*stack;intstack_size;int*local_vars;intlocal_vars_size;intpc;// 程序计数器}JVM;voidexecute(JVM*jvm,int*bytecode){intopcode;while((opcode...
typedefstructclass_descriptor{char*name;//类名称intsize;//类大小,即对应sizeof(struct)intnum_fields;//属性数量int*field_offsets;//类中的属性偏移,即所有属性在struct中的偏移量} class_descriptor; 然后是对象的结构,虽然C语言中没有继承的概念,但是可以通过共同属性的struct来实现: typedefstruct_object {...
1.创建JVM装载环境和配置 JVM装入环境,JVM提供的方式是操作系统的动态连接文件 2.装载JVM.dll 通过第一步已经找到了JVM的路径,Java通过LoadJavaVM来装入JVM.dll文件.装入工作很简单就是调用Windows API函数: LoadLibrary装载JVM.dll动态连接库.然后把JVM.dll中的导出函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArg...
本文想和大家来探讨一下JVM是如何对堆内存进行管理和垃圾回收,相关书籍如深入理解JVM第三版中已经介绍过了相关的垃圾回收算法及其实现,但是基于文字介绍无法让大家对垃圾回收有具象的理解,所以本文想从c内存模式和malloc函数介绍起,带领大家回顾一下如何使用c语言完成堆内存的申请和释放。
我们前面强调过,jvm是以栈为基础来运行指令的,任何指令的执行,如果需要参数的话,这些参数必须先压入虚拟机的堆栈上,指令才可以正常执行。从上面的代码可以看成,指令imul 的作用是做乘法操作,要相乘的两个数在执行这句指令前,必须都压入到堆栈的顶部,因此指令bipush 6的作用是把数值6压入到堆栈顶部,bipush 9作用...
DiscJVM 是一个基于jvm11规范以纯C语言编写的一个虚拟机实现,目的是为了深入理解虚拟机原理,并期望在此基础上尝试将内存映射至多机,以实现指令级的分布式执行而无需对代码作任何修改(目前内存映射这部分尚未实现)。 如果你对这个项目感兴趣,说明你应该看过或者了解过不少jvm相关的书籍或信息,但纸上谈兵总让你有隔...
3.深入了解一下编程语言的工作原理,现在的各种语言都针对虚拟机,比如JVM,Lua VM,FaceBook 的 Hip—Hop VM(PHP/Hack)等。 指令集 指令集会相对简单,我将简要介绍一下,例如如何从寄存器中移动值或跳转到其他指令。 假设我们的虚拟机有一组寄存器:A,B,C,D,E和F,且这些都是通用寄存器,这意味着它们可以用于存储...
JVM为每个已加载的类型都维护一个常量池。常量池就是这个类型用到的常量的一个有序集合,包括实际的常量(string,integer,和floating point常量)和对类型,域和方法的符号引用。池中的数据项象数组项一样,是通过索引访问的。 每个类的这些元数据,无论是在构建这个类的实例还是调用这个类某个对象的方法,都会访问方法...
经过前文《从JDK源码级深入剖析main方法的运行机制》的分析,我们知道了实现JavaMain方法的四个主要步骤: 初始化Java虚拟机 加载主运行类 通过加载的主运行类,获取main方法 调用main函数 下面,我们首先来看一下初始化Java虚拟机的具体实现细节。 上代码: static jboolean InitializeJVM(JavaVM **pvm, JNIEnv **penv...