由JAVA程序引出对JVM整体认识!

开发都知道,例如在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整体知识模块。


我是娆疆_蚩梦,让坚持成为一种习惯,感谢各位大佬的:点赞收藏评论,我们下期见!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

  • 1.前言 由于后期学习需要用到大量的JVM底层的东西,所有本人调整了一下学习计划,打算先从JVM入手,了解整个JA...
    叨唧唧的阅读 3,638评论 0 1
  • Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和...
    Java小辰阅读 6,476评论 1 9
  • 转载自:https://www.jianshu.com/p/28639d7a00fe 1. 什么是JVM? JVM...
    星海辰光大人阅读 1,293评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,728评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 11,348评论 4 8