JVM之内存结构模型详解
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内存结构中的,下一篇博客进行讲解~。