jvm是如何实现的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm是如何实现的相关的知识,希望对你有一定的参考价值。

为什么我们写出来的java代码能实现各种功能呢,能用它写出一个自己的jvm么?那么垃圾收集阿什么的,到底是怎么一回事?我学过半年C++,最近开始学java了,觉得编程语言这个东西很疑惑阿。

编程语言和自然语言类似,都是为了交流,自然语言用于跟人交流,程序语言则用于指示机器。
jvm其实也就是一个程序,这个程序能接受你的Java代码,然后根据你的意愿执行一系列操作。

举个例子,你可以写一个这样的程序,这个程序接受用户输入一句话,如果用户输入“beep”则调用机器的鸣叫,如果用户输入“exit”,则关掉本程序。在这个例子中,其实用户写的“beep”和“exit”就充当了程序语言的角色,只不过这门语言过于简单因此不可能普及。而java则具有完善的体系能够支持你表达任何意愿,然后jvm理解你的java语言并执行相应操作,这就是程序语言的原理。

当然java还有优化的方案,它的编译器将你的java语言翻译成字节码,因为jvm执行字节码的速度比直接理解java代码要快很多,后来的版本还引入了JIT技术,实时将字节码再编译成机器码,这样就能让机器直接执行指令而不需要jvm去解释。

至于垃圾收集器,就是jvm维护着每一个对象的引用(可以理解成C++里面的指针),根据一定的算法判断其是否可达,如果这个引用不可达(也就是程序的后续部分已经无法获取这个引用,比如说已超出block范围了)那么就清除这个内存对象。这样的好处是能避免由于程序员的疏忽引起的内存泄露,缺点是内存的清理不够即时,因而无用的对象常常会占据内存很长时间。

你也可以在C++里实现垃圾回收器,思路是写一个用于管理内存的类,然后程序里不再用new来新建对象,而是用这个类来产生对象,类内部拥有这个对象的指针,并在适当的时候delete它,这样就实现垃圾自动回收了,当然要写这样一个类是很困难的事。
参考技术A 如果你对这个感兴趣,不防学学编译原理 参考技术B 在C++中编程者要自己进行垃圾回收,但是在JAVA编程中程序员只有建议垃圾回收的权利,自己不能直接进行回收 参考技术C JVM(JAVA虚拟机)
Java编译程序将Java源程序翻译为JVM可执行代码—字节码。这一编译过程同C/C++的编译有些不同。
当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。
因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。

终结之战!JVM是如何基于虚拟机栈运行的

hello,小伙伴们好,我是江湖人送外号[道格牙]的子牙老师。


先说下手写JVM小班的事情。手写JVM小班一期已经完成招生,谢谢各位小姥的信任与支持。让你们变得牛叉,让你们成为别人眼中心中口中的大佬就是我的责任。我会为此目标持续升级优化课程,打造新课。


目前市面上确实没人教这块内容,所以目前依然有小伙伴来咨询。手写JVM小班分两个阶段实现,第一阶段是用Java实现,第二阶段用C++实现。我预测了下,五月底之前报名,一期班可以跟得上,之后只能跟二期班了。二期班会加入大难点多线程,会讲到操作系统的线程机制,所以价格相比一期会进行较大调整。


所以真的想学习手写jvm小班的小伙伴,真的意识到底层价值的小伙伴,良心建议跟一期。报名一期可以免费学习二期。关于每期价格的调整我都会严格控制,小伙伴们可以放心哈。我本原则:好东西价不贵。


本篇文章难度较高,小伙伴们先看吧。如果确实看不懂可以留言告诉我,我周末抽时间录成视频版。


本文研究啥


JVM执行Java代码是靠执行引擎实现的。执行引擎有两套解释器:字节码解释器、模板解释器。字节码解释器比较简单,不多说,看图。本篇文章咱们讨论模板解释器执行Java代码的底层原理。



早些年研究模板解释器看到R大用汇编写的迷你版解释器,心里想:太特么牛叉了,我连怎么实现的都不知道,人家都写出来了,这差距。随着自己的努力,不断的研究沉淀,如今这些对我来说也不是那么难了。



本篇文章更近一层,不仅告诉你JVM的执行引擎是如何实现的,还会告诉你JVM的执行引擎是如何在OS的栈与自实现的栈之间来回切换完成程序运行的。小伙伴们感受到了吗,那种接近技术本质的兴奋感。


答案


如果你只想知道答案:JVM的执行引擎,即模板解释器。是通过在OS的栈与自实现的虚拟机栈来回切换完成执行Java程序的。看图


终结之战!JVM是如何基于虚拟机栈运行的


确实很抽象,打个比方吧:你想写一个很大的字,比如:牙。一张纸你觉得不够大,你搞了两张纸。写完以后是不是每张纸上都有一点,拼在一起才是一个字。这里的笔就是执行引擎,两张纸大家应该都GET到了,一张如OS栈,一张如JVM栈。


原理讲到这个程度,小白应该都听懂了吧。那你是否想知道这么牛叉的技术,是怎么实现的?不想的,面试讲到这个程度就很牛叉了,你也不用担心面试官会追问,他可能并不知道要问啥。想知道的小伙伴继续往后面看。


答案解析


核心是一个寄存器:SP。


解释下这个寄存器:操作系统栈有两个寄存器:BP、SP(不同CPU位数名称不同)。BP指向栈底,SP执行栈顶。切栈的核心就是切SP寄存器。切得不好很容易把系统搞死机哈。^_^


为什么会死机?程序讲究对称,你如果把线程引入了死胡同,它出不来,又不阻塞,又不结束,可不就死机了吗?哎,又教会了小伙伴一个离职小技巧。


上段代码再解释一下吧



只能讲到这个份上了,再听不懂我也不知道怎么讲了。只剩下录视频一招了。如果你没看懂,留言告诉我。


这种技术称为栈编织技术。与其对应的是字节码编织技术、硬编码编织技术。


结语


我是子牙老师,喜欢钻研底层,深入研究Windows、Linux内核、JVM。喜欢分享硬核知识,如果你也喜欢研究底层,喜欢硬核知识,关注我。



推荐阅读


以上是关于jvm是如何实现的的主要内容,如果未能解决你的问题,请参考以下文章

在没有JVM支持的情况下,如何在JVM语言中实现协同程序?

07 JVM 是如何实现反射的

如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录

JAVA如何实现跨平台

《深入理解Java虚拟机》- JVM是如何实现反射的

简述如何实现区块链中的JVM