开发都知道,例如在idea中随便输入几行代码运行后就能在控制台输出结果。这是我们的常规操作,那整个过程你真的了解吗?接下来我带大家一块刨析刨析......
以下面的示例代码为例:
运行结果如下:
HelloWorld!
这段代码很简单,就是起一个main方法,在main方法中调用test1方法,test1方法中运行test2方法。描述很简单,那么控制台结果是怎么出来的呢?这块就牵扯到Java程序的执行过程:
一个Java程序,首先经过javac编译成.class文件,然后JVM将其加载到方法区,执行引擎将会执行这些字节码。执行时,会翻译成操作系统相关的函数。JVM作为.class文件的翻译存在,输入字节码,调用操作系统函数。
过程如下:java文件->编译器->字节码->JVM->机器码
那既然HelloWorld.java不能单独运行,就需要借助相关平台和工具(JVM、JRE、JDK)进行编译和运行,那这三者是什么关系呢?
JVM只是一个翻译,把class翻译成机器识别的代码,不会自己生成代码,同时需要很多依赖库,这个时候就需要用到JRE。JRE除了包含的JVM之外,提供了很多的基础类库(即就是jar包)。JVM标准+一大堆基础类库=Java的运行时环境(JRE)。但对于程序员来说,我写完代码还要编译,调试,打包,有时候还需要反编译代码,那么JRE就不够。所以我们会使用JDK,他提供了一些非常好用的小工具,比如:javac、java、jar等。
所有整个代码执行流程以及各个工具的关系如图所示:
上面的代码结果是在Windows操作系统上运行出来的,那么如果我想在MacOS操作系统上也运行该怎么办?这就牵扯到了跨平台
既然JVM只是一个虚拟化的操作系统,类似于Linux或者Windows操作系统,只是它架在操作系统上,接收字节码也就是class,把字节码翻译成操作系统上的机器码且进行执行。那么是不是只要在不同的操作系统架上不同的虚拟机就可以解决。跨平台:我们写的一个类,在不同的操作系统上(Linux,Windows,MacOS等平台)执行,效果是一样的。
如果我不用Java语言,用Scala语言能在JVM上面跑,达到上面的效果吗?这就牵扯到了跨语言
跨语言:JVM运行不是翻译Java文件,也没有直接关联,其实跟语言是解耦的,而是只识别字节码即class文件。除了Java,像Groovy、Scala等语言,它们其实也是编译成字节码,也可以在JVM上面跑。
现在大概的一个执行流程说完了,但是要了解流程中的详细过程我们就需要对JVM整个知识体系有一定深入的了解和研究:
比如内存结构、垃圾回收、类加载、性能调优、JVM自身优化技术、执行引擎、类文件结构、监控工具等。但是所有的知识体系中,或多或少跟内存结构有一定的关系:比如垃圾回收回收的就是内存、类加载加载到的地方也是内存、性能优化也涉及到内存优化、执行引擎与内存密不可分、类文件结构与内存的涉及有关系、监控工具也会监控内存。所以内存结构处于JVM核心位置。
这大概就是JVM整体知识模块。
我是娆疆_蚩梦,让坚持成为一种习惯,感谢各位大佬的:点赞、收藏和评论,我们下期见!
网友评论