你们好,欢迎你们来到庆哥Java,我是庆哥,据说自学Java的人都关注了我,你也赶快加入吧!欢迎~java
今天,庆哥带你们来看一个问题,就是咱们写的Java代码究竟是如何运行的?通常涉及到这样的话题,有些人确定会以为,确定又是底层,又是源码的,应该很差理解吧,因此这里先给你们作个声明,此次的分享,是带你们总体上对这个问题有一个认识,不会涉及到源码以及很深的底层问题.!程序员
可是保证你看了直呼过瘾,并且大家也都能看懂,毕竟庆哥的文章一直都是那么的通俗易懂!编程
开始啦,首先,我们看这样一段代码:markdown
public class Hello { public static void main(String[] args) { System.out.println("hello"); } }
简单吧,而后咱们运行,此时我是在IDEA中将其运行:
有没有想过,为何咱们写上上面的代码,而后点击运行就能输出打印hello呢?咱们接下来找到咱们写的这段代码的源文件:jvm
打开检查一下:ide
没问题,接下来咱们将此段代码复制到咱们桌面,而且把代码精简一下,也就是成了这样:学习
ok,注意咱们如今已经把Hello放在了桌面上了,代码也作了简化,就是把注释和包名去掉了,只留下核心部分,到了这里,应该没什么问题吧,应该都是听得懂看的明白的吧,那好,如今问题来了,我要问你一个问题:测试
请问如今的Hello.java存在于哪里?操作系统
你确定会说,简单啊,不是在桌面上吗?不,我想要的不是这个答案,给你几个选项吧:命令行
那好,如今你再来回答我,上述的Hello.java存在哪里?我想看到这里,应该每一个人内心都有了本身的答案吧,我以为这并非什么难题,只要你看过我以前的文章,你都能回答的对,答案就是硬盘!
咱们买电脑,大部分时候也都会注意到电脑的容量大小,这里指的就是咱们的硬盘大小,好比个人就是就是1T:
那你们为何要在乎这个呢?说的简单点,容量大了,我能够装的东西就多了,好比能够装更多的软件啊,文件啊,好比图片啊,小电影啊,等等,反正电脑上的大部分东西,可下载的那些都须要容量来存储,也就是咱这磁盘是咱能接触到的最明显的存储设备,好比个人E盘,你们能够看到,已经爆红了,就是容量很少了,若是我如今想下载个100G的某系列影片,那确定装不下了,没容量啦,空间不够用!
一样的,咱们写的上述的那个Hello.java也是做为一个文件存在于咱们的电脑上,而这些东西说白了,都是存储在咱们的硬盘上,此时是存在桌面,而桌面是位于C盘下的,因此咱这文件其实就是存在C盘中的,可是不管存储在哪一个盘,都是在咱们电脑中的硬盘当中,好比我这里的硬盘其实就是一块1T的固态硬盘,是我后来分区成以上三个盘的,这些想必你们都懂,因此,咱们写的Hello.java文件实质上是存储在咱们的电脑硬盘当中!
ok,到了这里,咱们搞清楚了,咱们刚开始写的这些java源文件是存储在哪里,接下来咱们继续!
以上这些操做都没什么问题吧?这一步操做是一个编译的过程,为何要这样搞,咱们紧接着看下面的操做:
上面有一个错误,目的是为了告诉你们,编程的学习要认真,不能马虎,不少本身搞出来的错误都不是啥大问题,不少都是本身粗枝大叶形成的,记得,要认真,好了,言归正传,咱们上面又使用了java指令去执行Hello.class文件,最后打印输出“hello”,什么意思呢?
注意看了,也就是咱们写的后缀是java的叫作java源文件,这个是咱们程序员本身写的,也就是这些代码:
public class Hello { public static void main(String[] args) { System.out.println("hello"); } }
这些代码,咱们看着没啥问题,懂点java的都知道怎么回事,可是,对于电脑来讲,它就不认识了,因此中间得有个转换的过程,把咱们认识的这些java代码转换成计算机能够认识的代码,因此有这么一张图,你们能够看看:
就是说,咱们须要把java源文件编译生成字节码文件,也就是点class文件,这个字节码文件实际上是java虚拟机识别的语言,可是咱们知道,java是一种跨平台语言,所谓的跨平台主要就是由java虚拟机来实现,咱们只要把字节码文件交给java虚拟机,接下来的就有虚拟机去与相应的底层操做系统打交道,去把相应的字节码文件转换成底层操做系统CPU能够执行的指令,因此,做为咱们,暂时关注到字节码这个层面便可,也就是,你得有字节码,才能交给JVM去执行!
另外再给你们说两点小知识,就是:
为何要说这个,那是由于当咱们在命令行窗口执行该指令的时候:
这个时候是会启动一个jvm虚拟机的,其实也好理解,由于咱们的字节码文件是须要交给jvm去执行的,如今咱们这里的操做就是要执行Hello.class字节码文件的,在这里的输入咱们能够直接省略掉后缀名class,直接输入“java Hello”便可!
到了这里我又必须问你一个新的问题了,你说这个Hello.class文件是存储在哪里的?
其实答案显而易见啊,必须仍是咱们的电脑硬盘中的,也就是此时咱们写的java源文件Hello.java以及咱们编译生成的字节码文件Hello.class都是存储在咱们的电脑桌面,实质就是电脑硬盘当中!
到了这里我就必须在给大家来点干货知识了,你要记住如下这句话:
咱们写的程序,要想运行,最终必须加载进内存中,才能被CPU调取执行,并且全部的程序在内存中都是以二进制的形式存在的!
咋样,对以上描述有疑惑吗?
那如今,咱们是否是有了字节码文件,因而咱们执行“java Hello”去执行该字节码文件,这里的过程须要再次强调下,也就是说,当咱们在命令行窗口去执行java指令的时候,实际上就会启动一个jvm虚拟机,在电脑中是一个进程形式存在的,也就是一旦执行“java”指令,测试就启动了一个jvm进程,此前咱们说过了,字节码是jvm可以识别的语言,此时这个jvm就是用来执行咱们的这些字节码文件的!
这个时候jvm就会把字节码中的相关类加载进咱们的内存中去,这就是类加载器在起做用,想必这个类加载器的概念,你们必定不陌生吧,也就是此时,本来在咱们电脑硬盘中的字节码文件经过java指令启动的jvm,将其加载进内存中去了,你要知道,咱们的java代码都是由一个个的类组成的,因此此时就由jvm将咱们的字节码class文件加载进内存中了,这其中的具体转换细节暂不讨论!
这里能够稍微透露一下,其实jvm有本身的一套字节码执行引擎,jvm就会基于本身的字节码执行引擎,去执行加载进内存的那些类了,咱们知道,咱们的java代码必须有一个主入口,也就是一个“main()”方法,jvm就是从这个main方法开始执行代码,而后一步步的执行下去,须要哪一个类,就会使用类加载器去加载对应的类,由于咱们以前的全部java源文件已经被编译生成字节码文件了,须要啥类都直接从这个点class文件中加载便可。
固然,以上内容目前只需了解便可,你只要记住,是jvm把字节码文件从硬盘加载进内存中便可!
ok,以上就是我此次要给你们分享的所有内容了,到了这里,也许你会发现,其实整个文章并无什么高深莫测的东西,能够说都是一些比较基础的东西,可是我相信,不少人是没有把这些基础的东西给串联起来的,也没有思考过,咱们写的代码,刚开始是存储在哪,又是怎样被加载运行的,一步步的,抽丝剥茧,虽然简单,可是总归也会让你有所收获!
你说是吗?
好啦,这里是庆哥Java,一个只讲Java干货的硬核平台,我是大家的庆哥,咱们下期再见!