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代码。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

Zookeeper总览

ZooKeeper是一款开源的 分布式应用 的 分布式协调服务 。它包含一个简单的 原语集 ,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zoo...

19410
来自专栏架构师之路

TCP接入层的负载均衡、高可用、扩展性架构

一、web-server的负载均衡 ? 互联网架构中,web-server接入一般使用nginx来做反向代理,实施负载均衡。整个架构分三层: 上游调用层,一般是...

52360
来自专栏Youngxj

最新Kangle一键安装脚本免费发布PHP5.2-7.0

1.2K60
来自专栏Web项目聚集地

Linux养成计划(二)

这篇文章介绍关于Linux系统的目录结构,比较Linux系统和Windows系统目录结构的区别。我们知道在Linux中一切皆文件,包括它的硬件,声卡、硬盘等等都...

12610
来自专栏性能与架构

前端构建工具grunt

grunt是什么 grunt是目前非常流行的前端构建工具,支持自定义插件,有丰富的插件帮助我们完成构建任务 自动化完成我们指定的任务,例如压缩、编译、单元测试、...

34750
来自专栏小文博客

自动批量取消关注微信公众号——按键精灵

37940
来自专栏后端技术探索

让nginx更安全的几点注意事项

Nginx是当今最流行的Web服务器之一。它为世界上7%的web流量提供服务而且正在以惊人的速度增长。它是个让人惊奇的服务器,我愿意部署它。 下面是一个常见安全...

10020
来自专栏从零开始学 Web 前端

换了电脑如何使用hexo继续写博客

我们知道,使用 Github+hexo 搭建一个个人博客确实需要花不少时间的,我们搭好博客后使用的挺好,但是如果我们有一天电脑突然坏了,或者换了系统,那么我们怎...

18230
来自专栏后端技术探索

狼厂项目实践:通用检索框架准实时流的设计与实现

检索对实时性的要求很高,不仅是对索引建立、结果召回、策略干扰等核心部分,也包括数据录入的部分。检索的数据流主要包括全量数据与增量数据,其中全量数据是在运行前就已...

10010
来自专栏互联网技术栈

Tair数据迁移三步走

在多机房数据迁移中,整个过程分为三个阶段:历史数据迁移阶段、redolog迁移阶段、实时复制阶段。

14530

扫码关注云+社区

领取腾讯云代金券