前言

  作为一个JAVA开发者,不了解Java虚拟机的原理是不行的, 只有了解了基本原理之后,我们才能写出更加高效的代码,同时也有助于我们在 上线的时候排查问题。同时想要进阶学习Java知识,JVM是一个绕不开的问题, 建议有点Java基础的同学,再来看这部分内容会比较容易,我并不是很建议大家在学习Java 初期一上来就学习JVM,当然学习这个事情因人而异,只要自己能学知识到就行了。 Java虚拟机这部分内容,后面应该还会写很多篇,按照我目前的预想, 是按照由简到细的顺序进行介绍的。本篇文章打算先从一个Java程序是如何运行起来的讲起 ,然后介绍加Java虚拟机的整体结构,后面再对其做详细的介绍。

一次编译,随处运行

  我们都知道Java对外的宣传口号就是一次编译,随处运行,那到底是如何实现 这一口号的呢?同时我们知道Java是一门跨平台的语言,那它又是如何实现跨平台的呢?相信 通过下面的例子,我们能有一个大致的了解。假如现在我有一个HelloWorld.java文件,内容如下:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("hello world!");
    }
}

这个例子不用我多说,那它到底是如何通过编译,运行,最终在终端展示出”Hello world” 的呢,请看下图:   Java程序经过一次编译,将Java程序编译成了字节码文件,也就是我们例子中将 HelloWorld.java文件编译成了HelloWorld.class文件,然后将class文件加载到不同操 作系统上的虚拟机JVM中,虚拟机将class文件解释并翻译成各个操作系统能识别的机器码,如上图中 的Windows环境和Linux环境,最终操作系统就能识别出并执行我们上图中的HelloWorld文件 然后我们就可以在终端上看到”hello world!”字样。

JVM执行过程

  通过上面的介绍,我们对于Java程序大致的执行过程有了一个初步的了解。 但是对于JVM到底是如何来解释我们编译的class文件的,一个class是怎样被虚拟机找到并 执行的呢,通过下面的图解,我们可以有一个较为清晰的了解。 从图中我们可以看到,Java虚拟机通过加载配置,找到JVM的主要实现jvm.dll文件,然后初始化 jvm,获取JNI接口,通过JNI接口在本地找到我们存放的class文件,然后找到main方法并运行。

JVM结构图

  通过上面,我们可以大致了解虚拟机的大致执行过程,但是实际远比这复杂, 不过也不用担心,后面我们一起逐步的分解学习,便能有一个清楚的认识。下面是JVM的一个整体 结构图,后面的讲解也会按照这个图上的内容,深入讲解虚拟机的相关知识,希望与大家共勉。

总结

  以前记笔记都是自己随便整理一个doc文件,就当做学习笔记了,完全没有系统的 总结和学习,都是零零散散的。写博客一是为了系统化的学习,总结点滴知识, 还有就是做一个记录和分享,虽然才刚开始,但是慢慢来吧,加油。

参考

1.《深入理解JVM(二)》 PS:这次没有PDF链接了,只有纸质书籍~~~