JVM之认识程序运行本质

2021-12-17 18:50:24 浏览数 (1)

JVM之内存结构模型详解

  • JVM是什么
    • 汇编语言
    • 高级语言
    • 虚拟机是什么
  • java代码如何转换成机器识别的代码

JVM是什么

刚入门的时候老师教我们写代码是这样的:

写JAVA文件然后用javac命令编译成class文件运行即可。

随着学习的不断拓展和工作中业务代码的积累,对于“为什么会这样”的困惑越来越多,于是写了这篇博客~。

计算机能看懂的是二进制,也就是0和1。那么我们的JAVA程序和计算机又有什么关联呢?他们是怎么联系到一起的?

汇编语言

计算机只能识别0和1,人们发现利用0和1可以做很多事情:

比如可以做加法,由此减乘法除法(利用的也是加法)也可以做到;与,或,异或等这些构成了与门,非门等这些逻辑门;…在这上面进行扩展又可以做很多事情。

但是编写0和1太过于麻烦,这个时候出现了助记符也就是用一个英文代表一串01的数字,也就是汇编语言。

高级语言

对于开发者来说,用汇编写代码不太现实,一个简单的操作要用很多行汇编代码才能实现,所以再它之上做了处理,比如java,c,等等高级语言。那么计算机怎么识别高级语言的呢?

虚拟机是什么

答案是虚拟机,虚拟机可以理解为虚拟计算机,虚拟计算机通过解释器将其认识的指令解释为计算机认识的指令。JVM中只通过解释器来解释运行效率太慢,所以对于热点代码即反复执行的代码通过JIT即时编译器将其编译为本地代码。这个编译器叫做后端编译器。

JVM流行的一点原因是其跨平台性:一次编译,多端运行 怎么实现的大家也大概猜到了,JVM虚拟机识别操作系统将class字节码转换为不同操作系统可以识别的指令。

java代码如何转换成机器识别的代码

我们写代码的时候通过编写JAVA文件,通过javac命令编译成class文件,用java命令运行class文件。

拆分: 一,也就是javac命令将java代码编译成为java字节码也就是class文件,这个编译器叫做前端编译器。编译后的class文件由0和1构成,这其实是java字节码的结构。

二,通过类加载器ClassLoader的加载,链接,初始化后将其转换为JVM内存中的数据。我们要想看到class字节码结构是什么样的,可以通过反编译class文件,讲解JAVA字节码文件将在后面博客中详细介绍。

三,执行引擎将高级语言翻译为机器语言即计算机能够识别的语言。

总结:前端编译器将Java文件转换为字节码class文件,通过类加载器ClassLoader的加载,链接,初始化这三步加载到内存中,JVM识别字节码文件将数据放到对应的内存结构中,但是机器不认识这些字节码文件,所以执行引擎又进行了编译转化为计算机能够识别的指令【后端编译器】,其充当了转换字节码的任务(通过解释器解释运行,但是由于效率低,所以对于热点代码通过JIT即时编译器编译成本地代码)

最后来张图: 图中运行时数据区为JVM内存结构中的,下一篇博客进行讲解~。

0 人点赞