Java基础系列---Java平台上的一些问题

  从学习Java开始,我们接触了许多框架,从Hibernate、Strus、Strus2、Spring、Spring MVC、Spring boot等等,做Java开发的小伙伴们肯定对这些有一些了解了,但是,在我们面试的时候,基本上都有一个问如何造飞机系列的题---JVM,作为Java生态圈很重要的一环,而且可以说是有了JVM那个编译一次,到处运行的口号,Java语言才真正的屹立语言圈,即使如今AI、大数据崛起,依旧保持着龙头语言的位置。我们今天就来了解一下jvm这个东东。

  正如大家在了解的一样,Java语言有2大特性,一是一次编译,到处运行,第二个是优秀的垃圾回收机制

  接下来我们就对Java平台上的jdk和文件执行大致了解一下。

  上面这个图是我们在Oracle官网下载Java的时候选项,当然我们一般开发肯定是下载jdk的,不过,这里有个小细节就是,jdk和jre的区别,(Server JRE是服务器版本,我们将之和JRE合并区别JDK)。

  其中JRE是一个运行环境,包括了JVM和Java的一些基本类库,比如我们之前玩过的《我的世界》,我们在安装的时候就会安装一个JRE环境。

上图是JRE bin目录

而JDK则是在JRE的基础上提供了更多的工具,包括了我们熟悉的javac、jstat等。

 

 

 

上图是JDK bin目录,可以看出jdk目录的工具更加的丰富。  

一次编译,到处运行

  这个到处运行,指的是在JVM上运行,而不是无环境运行,因为我们在写完代码后,文件为.java格式的,然后通过Javac将源码编译成.class文件,然后jvm会把.class文件转化为目标机器上可直接执行的文件(注意这个目标机器,是在运行jvm的机器平台上),所以一个Java文件从编写到真正的运行其实经历了2次编译,经历了3个阶段:编码——编译(2次)——运行Java语言跟其他语言其实并没有差别,而且并不是Java语言可以跨平台,而是在不同的平台都有它的运行环境而已

   讲完了一次编译到处运行,我们接下来讲讲Java文件是如何执行的,众所周知,Java分为编译时和运行时,大家如果了解过Java文件加载机制就会知道,一个java文件在编译后会形成一个或者多个class文件(比如一个java文件中存在内部类的情况就会出现多个class文件),然后这些文件中信息只有被jvm加载,校验,解析后才能在运行时使用,这个阶段就称之为类加载机制。而这个类加载机制是属于运行期间哦,也就是说,在程序跑起来后才会进行类加载,而这样做的好处就是我们可以动态的去调整和获取我们的一些类信息。比如Java的接口和其实现,我们在编写的时候并没有特定的去指定其实现类,在运行期间,才去指定。所以我们在编写代码成java文件并编译成class文件的时候指的就是编译时,而在项目启动后,加载这些具体的class文件信息就属于运行时。

  问题:Java到底是解释执行还是编译执行呢?因为Java代码是需要编译的,编译不过就无法执行,所以说是编译执行的。也有的观点是Java的文件终归是要经过jvm加载后执行,这里的加载就相当于解释,它是解释后运行在jvm上,也说它是解释执行。

  编译执行一般是指像C或者C++这种,经过编译后是可以直接运行在目标机器上的,而Java呢?前面其实已经说到了,Java是由java文件编译成class文件,然后再有jvm从class文件读取内容,验证和加载的。所以这一部分是解释的。

  所以,从技术上讲,可以提前将Java编译为本机代码并运行生成的二进制文件。也可以直接解释Java代码。

  “解释语言”或“编译语言”并没有什么意义,因为任何编程语言都可以被解释和/或编译。

 

posted @ 2018-08-09 23:18  haoming1100  阅读(105)  评论(0编辑  收藏  举报
本文作者: haoming1100 博客链接: http://www.cnblogs.com/haoming1100 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载时必须带上原文链接!