手写JVM虚拟机?

简介: 手写JVM虚拟机?

相信很多搞Java开发都知道, Java程序的跨平台是依靠jvm的, 那jvm既然承担了Java程序的编译,解释,执行的工作,那是不是我们可以自己手写虚拟机呢,答案是可以的 。

虚拟机我们都知道用 C++ 写的hotspot, 其实很多厂商都有自己的一套虚拟机。想IBM用的是自己的OpenJ9。所以手写虚拟机还是可以实现的。


在idea 上很容易通过jclasslib  查看到字节码指令。

我们来看一组通用指令

iconst_0   将自然数0压入操作数栈

iconst_1   将自然数1压入操作数栈

iload_0     将索引为0的局部变量表的int型数据压入操作数栈

istore_1    将操作数栈栈顶的int型数据写入索引为1的局部变量表中。

// ......

在jvm 源代码中,定义了Java语言的全部指令集,若是平时接触过字节码的话,你对上面的应该就不陌生。   Java有了这套通用的指令集, 就有一统江湖的希望了。

这些指令有200多个, 这些指令都有自己实现逻辑, 我们把这些指令搞明白了,其实对jvm操作底层的指令就一目了然, 实现自己的jvm也就水到渠成了,看着是好简单,但这些都暗藏玄机,往往涉及到底层的东西,越是难懂。

我还真佩服那些 写出 jvm 这种鬼才。从0到1 是最难的。 现在我们是站在巨人的肩膀上, 把已有的jvm  hotspot 源码看明白, 再模仿写一个, 看似也没那么难。哈哈哈, 毕竟,模仿,还是比较在行的。


当然,要看懂这些指令集,还得懂 汇编。 常见的汇编指令,像什么 数据传送指令, 算术运算指令, 逻辑运算指令, 串指令, 程序转移指令。

1、数据传送指令

// 将自然数 1 传送到 eax 寄存器

mov1  1, %eax

// 将栈顶数据弹出至eax 寄存器

pop   %eax


2、算术运算指令

包括算术基本四则运算、 浮点运算、 数学运算(正弦,反弦)等。

例如:

//   将自然数3 与 eax 寄存器中的数累加,并将结果存储进eax 中

add 3,%eax

//    对 ebx 寄存器的数增1

inc  %ebx

3、逻辑运算指令

与、或、非、左移、右移等指令,都属于逻辑运算指令。例如

//  将 eax中的数 左移 1个二进制

sh1   %eax,  1

// 对 a1 寄存器中的数和操作数进行与操作

and  a1,  00111011B


4、串指令

连续空间分配,联系空间取值,传送等,都要使用串指令。很多高级

编程语言都支持字符串运算,如果硬件没有串指令,不敢想象计算机的世界会变成什么样。


5、程序转移指令

if....else  判断、 for 循环、 while 循环、函数调用等, 都需要依靠程序转移指令,否则程序无法跳转。没有这些指令,程序不能模块化,无法被分隔成一个一个方法,更无法通过循环来解决很多重要的问题。常见的程序转移指令包括jmp 跳转、loop 循环、ret 等。


这些指令在底层都和着计算机进行打交道。 所以,不容小觑啊!

目录
相关文章
|
24天前
|
Java Docker 索引
记录一次索引未建立、继而引发一系列的问题、包含索引创建失败、虚拟机中JVM虚拟机内存满的情况
这篇文章记录了作者在分布式微服务项目中遇到的一系列问题,起因是商品服务检索接口测试失败,原因是Elasticsearch索引未找到。文章详细描述了解决过程中遇到的几个关键问题:分词器的安装、Elasticsearch内存溢出的处理,以及最终成功创建`gulimall_product`索引的步骤。作者还分享了使用Postman测试接口的经历,并强调了问题解决过程中遇到的挑战和所花费的时间。
|
1月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
2月前
|
Arthas 监控 算法
JVM成神路终章:深入死磕Java虚拟机序列总纲
JVM成神路终章:深入死磕Java虚拟机序列总纲
|
2月前
|
监控 Oracle Java
(一)JVM成神路之初识虚拟机 - 探寻Java虚拟机的前世今生之秘
JVM(Java Virtual Machine)Java虚拟机的概念大家都不陌生,Java之所以可以做到“一次编译,到处运行”的跨平台性,其根本原因就在于JVM。JVM是建立在操作系统(OS)之上的,Java虚拟机屏蔽了开发人员与操作系统的直接接触,我们在通过Java编写程序时,只需要负责编写Java代码即可,关于具体的执行则会由JVM加载字节码后翻译成机械指令交给OS执行。
|
2月前
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
148 10
|
2月前
|
监控 算法 Java
深入理解Java虚拟机:JVM调优的实用策略
在Java应用开发中,性能优化常常成为提升系统响应速度和处理能力的关键。本文将探讨Java虚拟机(JVM)调优的核心概念,包括垃圾回收、内存管理和编译器优化等方面,并提供一系列经过验证的调优技巧。通过这些实践指导,开发人员可以有效减少延迟,提高吞吐量,确保应用稳定运行。 【7月更文挑战第16天】
|
1月前
|
监控 算法 Java
深入理解Java虚拟机:JVM调优与性能提升
本文旨在为Java开发者提供一条清晰的路径,以深入掌握Java虚拟机(JVM)的内部机制和性能调优技巧。通过具体案例分析,我们将探讨如何识别性能瓶颈、选择合适的工具进行监控与调试,以及实施有效的优化策略,最终达到提高应用程序性能的目的。文章不仅关注理论,更注重实践应用,帮助读者在面对复杂的Java应用时能够游刃有余。
46 0
|
2月前
|
存储 Java 对象存储
Java虚拟机(JVM)中的栈(Stack)和堆(Heap)
在Java虚拟机(JVM)中,栈(Stack)和堆(Heap)是存储数据的两个关键区域。它们在内存管理中扮演着非常重要的角色,但各自的用途和特点有所不同。
38 0
|
2月前
|
存储 算法 Java
(四)JVM成神路之深入理解虚拟机运行时数据区与内存溢出、内存泄露剖析
前面的文章中重点是对于JVM的子系统进行分析,在之前已经详细的阐述了虚拟机的类加载子系统以及执行引擎子系统,而本篇则准备对于JVM运行时的内存区域以及JVM运行时的内存溢出与内存泄露问题进行全面剖析。
|
2月前
|
存储 监控 算法
探索Java虚拟机:深入理解JVM内存模型和垃圾回收机制
在Java的世界中,JVM是核心所在,它不仅承载着代码的运行,还管理着内存资源。本文将带你深入了解JVM的内存模型和垃圾回收机制,通过具体数据与案例分析,揭示它们对Java应用性能的影响,并探讨如何优化JVM配置以提升效率。