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

开发都知道,例如在idea中随便输入几行代码运行后就能在控制台输出结果。这是我们的常规操作,那整个过程你真的了解吗?接下来我带大家一块刨析刨析......

以下面的示例代码为例:

public class HelloWorld {

    public static void main(String[] args) {
        test1();
    }

    public static void test1(){
        test2();
    }

    public static void test2(){
        System.out.println("HelloWorld!");
    }
}

运行结果如下:

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整体知识模块。

 

我是娆疆_蚩梦,让坚持成为一种习惯,我们下期见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值