知识点今天给大家分享一个知识点,就是平时我们写的Java代码是如何运行的,运行后又是如何变成JVM进程的呢?那么JVM进程是如何运行我们写的代码的呢?这些问题对于很多长期写Java的兄弟来说肯定是不清楚的。今天我们就来谈谈这些问题。写好的Java代码如何运行?首先,我们通常开发一个Java系统。其实说白了就是在我们本地的IntellijIDEA里面写了很多Java代码。这些Java代码实际上是后缀为.java的文件。我们编写的Java代码存储在这些文件中,后缀为.java。本质上和在word中写一个后缀为.doc的文档是一样的。如下图所示:接下来,假设你已经写了一些代码,现在要运行代码,你首先要做一件事,那就是编译。这种编译意味着我们的计算机无法理解您编写的Java代码。我们要把写好的代码编译成计算机可以理解的机器语言,也就是字节码。所以这个时候我们就得先做编译这个动作。当然,如果你平时使用IntellijIDEA,其实它会自动帮你编译代码,编译后的字节码文件会有.class后缀。如下图所示:接下来,最关键的一点来了。如果您想自己运行代码,可以在命令行上向.class字节码文件发出java命令。如果你用的是IntellijIDEA,那么你点击运行代码按钮,他会先自动帮你编译代码,然后他会直接用java命令运行.class字节码文件。如下图所示:运行后如何成为JVM进程?这时候只要下达java命令,就会直接启动一个JVM进程,所以JVM进程就是这么来的。大家要注意,你的任何一个Java系统的运行都离不开JVM进程。当你用java命令运行你的代码时,肯定会启动一个JVM进程,接下来的事情必须交给这个JVM进程来完成。如下图所示:接下来JVM进程要做一件事情,就是类加载,也就是说要把我们写的类一个一个加载到内存中,然后包括加载我们的.class字节代码说明,然后我们就可以运行我们写的代码了。这个时候最先加载的类就是包含main方法的main类,这个类会先被加载到内存中,这个类中的字节码指令也会开始执行。如下图所示:那么这个时候JVM有两个东西可以带出来,一个是方法区,或者现在新版的Java也可以叫元数据区,就是这个区域存放我们加载到内存中的类。另一个是程序计数器,它存储了我们要运行的下一条字节码指令。可能有人会说,这个字节码指令是什么?你大概可以认为,字节码指令就是在我们的方法中编写的代码,这些代码会转化为字节码指令,我们的代码逻辑会通过字节码指令来运行。如下图所示:为了给大家一个形象一点的例子,我们来看一个包含main方法的类的代码:publicclassApplication{publicstaticvoidmain(String[]args){//alot代码}}JVM进程我们如何运行我们编写的代码?那么当我们的JVM进程启动的时候,对于这个Application类,我们是不是要把它加载到我们自己的方法区的内存区中去呢?那么JVM进程要执行main方法中的一行一行的代码吗?如何执行代码?当代码被编译时,它被转换成字节码指令。这时候就需要用程序计数器将字节码指令一条一条地引用,然后通过CPU运行每条指令。相当于把我们的每一行代码都跑一遍。如下图所示:然后,在执行字节码指令的过程中,你可能会发现你的方法中会有一些局部变量,同时会创建一些对象,局部变量会引用对象你创造了。具体代码可能类似下面,请参考:publicclassApplication{publicstaticvoidmain(String[]args){Useruser=newUser();}}这个时候会发生什么?也很简单,对于那个User用户来说,这是一个方法内的局部变量。在其他代码指令执行过程中,这个变量会被扔到一个叫做栈内存的地方。这个栈内存是用来存放你方法代码运行过程中的局部变量的,那你用newUser()创建的对象呢?这种对象放在堆内存中,专门用来存放对象,而栈内存中的变量指向堆内存中的对象。如下图所示:最后一个概念是线程。JVM进程实际上会默认开启一个主线程来运行main方法中的代码,即main方法中的字节码指令。另外,还可以在代码中开启其他线程,并发运行其他代码,所以其实应该引入一个线程执行代码的概念。如下图所示:总结至此,我们可以总结一下我们写的Java代码是如何一步步运行起来的,又是如何变成一个持续运行的JVM进程的。首先我们的Java代码要编译成字节码,其次我们要用java命令启动一个JVM进程,然后JVM进程会把我们写的类加载到方法区,同时启动一个默认的主线程,通过程序计数器一条一条指向我们main方法中的指令,指令由CPU执行。那么在执行我们方法的代码指令的过程中,局部变量会被扔进栈内存,创建的对象会被扔进堆内存。当一个方法运行结束时,这个方法的变量将从栈内存中清除,然后在堆内存中不再引用该方法运行过程中创建的对象。垃圾收集线程回收这些未使用的对象。这就是我们的JVM的工作方式。
