作者|杨晓峰出处|极客时间《Java技术核心 36讲》专栏

从你接触 Java开发到现在,你对 Java最直观的印象是什么呢?是它宣传的 “Compile once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java平台到底了解到什么程度?请你先停下来总结思考一下。

今天我要问你的问题是,谈谈你对 Java平台的理解?“Java是解释执行”,这句话正确吗?

典型回答

Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“一次编译,到处执行”(Compile once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),Java通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。

我们日常会接触到 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)。 JRE,也就是 Java运行环境,包含了 JVM和 Java类库,以及一些模块等。而 JDK可以看作是 JRE的一个超集,提供了更多工具,比如编译器、各种诊断工具等。

对于“Java是解释执行”这句话,这个说法不太准确。我们开发的 Java的源代码,首先通过 Javac编译成为字节码(bytecode),然后,在运行时,通过 Java虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK提供的 Hospot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。

考点分析

其实这个问题,问得有点笼统。题目本身是非常开放的,往往考察的是多个方面,比如,基础知识理解是否很清楚;是否掌握 Java平台主要模块和运行原理等。很多面试者会在这种问题上吃亏,稍微紧张了一下,不知道从何说起,就给出个很简略的回答。

对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java知识理解得也比较全面,一定要避免让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。

即使感觉自己的回答不是非常完善,也不用担心。我个人觉得这种笼统的问题,有时候回答得稍微片面也很正常,大多数有经验的面试官,不会因为一道题就对面试者轻易地下结论。通常会尽量引导面试者,把他的真实水平展现出来,这种问题就是做个开场热身,面试官经常会根据你的回答扩展相关问题。

知识扩展

回归正题,对于 Java平台的理解,可以从很多方面简明扼要地谈一下,例如:Java语言特性,包括泛型、Lambda等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。

或者谈谈 JVM的一些基础概念和机制,比如 Java的类加载机制,常用版本 JDK(如 JDK 8)内嵌的 Class-Loader,例如 Bootstrap、 Application和 Extension Class-loader;类加载大致过程:加载、验证、链接、初始化(这里参考了周志明的《深入理解 Java虚拟机》,非常棒的 JVM上手书籍);自定义 Class-Loader等。还有垃圾收集的基本原理,最常见的垃圾收集器,如 SerialGC、Parallel GC、 CMS、 G1等,对于适用于什么样的工作负载最好也心里有数。这些都是可以扩展开的领域,我会在后面的专栏对此进行更系统的介绍。

当然还有 JDK包含哪些工具或者 Java领域内其他工具等,如编译器、运行时环境、安全工具、诊断和监控工具等。这些基本工具是日常工作效率的保证,对于我们工作在其他语言平台上,同样有所帮助,很多都是触类旁通的。

下图是我总结的一个相对宽泛的蓝图供你参考。

不再扩展了,回到前面问到的解释执行和编译执行的问题。有些面试官喜欢在特定问题上“刨根问底儿”,因为这是进一步了解面试者对知识掌握程度的有效方法,我稍微深入探讨一下。

众所周知,我们通常把 Java分为编译期和运行时。这里说的 Java的编译和 C/C++是有着不同的意义的,Javac的编译,编译 Java源码生成“.class”文件里面实际是字节码,而不是可以直接执行的机器码。Java通过字节码和 Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“一次编译,到处执行”的基础。

在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。就像我前面提到的,主流 Java版本中,如 JDK 8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通常运行在 server模式的 JVM,会进行上万次调用以收集足够的信息进行高效的编译,client模式这个门限是 1500次。Oracle Hotspot JVM内置了两个不同的 JIT compiler,C1对应前面说的 client模式,适用于对于启动速度敏感的应用,比如普通 Java桌面应用;C2对应 server模式,它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。这里不再展开更多 JIT的细节,没必要一下子就钻进去,我会在后面介绍分层编译的内容。

Java虚拟机启动时,可以指定不同的参数对运行模式进行选择。 比如,指定“-Xint”,就是告诉 JVM只进行解释执行,不对代码进行编译,这种模式抛弃了 JIT可能带来的性能优势。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。与其相对应的,还有一个“-Xcomp”参数,这是告诉 JVM关闭解释器,不要进行解释执行,或者叫作最大优化级别。那你可能会问这种模式是不是最高效啊?简单说,还真未必。“-Xcomp”会导致 JVM启动变慢非常多,同时有些 JIT编译器优化方式,比如分支预测,如果不进行 profiling,往往并不能进行有效优化。

除了我们日常最常见的 Java使用模式,其实还有一种新的编译方式,即所谓的 AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码,这样就避免了 JIT预热等各方面的开销,比如 Oracle JDK 9就引入了实验性的 AOT特性,并且增加了新的 jaotc工具。利用下面的命令把某个类或者某个模块编译成为 AOT库。

  1. jaotc --output libHelloWorld.so HelloWorld.class

  2. jaotc --output libjava.base.so --module java.base

然后,在启动时直接指定就可以了。

java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld

而且,Oracle JDK支持分层编译和 AOT协作使用,这两者并不是二选一的关系。如果你有兴趣,可以参考相关文档:http://openjdk.java.net/jeps/295。AOT也不仅仅是只有这一种方式,业界早就有第三方工具(如 GCJ、Excelsior JET)提供相关功能。

另外,JVM作为一个强大的平台,不仅仅只有 Java语言可以运行在 JVM上,本质上合规的字节码都可以运行,Java语言自身也为此提供了便利,我们可以看到类似 Clojure、Scala、Groovy、JRuby、Jython等大量 JVM语言,活跃在不同的场景。

今天,我简单介绍了一下 Java平台相关的一些内容,目的是提纲挈领地构建一个整体的印象,包括 Java语言特性、 核心类库与常用第三方类库、Java虚拟机基本原理和相关工具,希望对你有所帮助。

Java 面试经典题解析:谈谈你对 Java 平台的理解?相关推荐

  1. Java基础2019最新Java面试经典题解析

    Java基础2019最新Java面试经典题解析 1简述JVM.JRE.JDK的区别 JVM:java虚拟机 ,加载.class并运行.class JRE:java运行环境除了包含JVM以外还包含了运行 ...

  2. Java面试经典题:线程池的成长之路

    本文转载自公众号: 猿天地 1.背景 相信大家在面试过程中遇到面试官问线程的很多,线程过后就是线程池了.从易到难,都是这么个过程,还有就是确实很多人在工作中接触线程池比较少,最多的也就是创建一个然后往 ...

  3. Java高级:字节跳动历年校招Java面试真题解析

    引言 做了5年开发的我,阿里一直是我心之所向,如今我如愿以偿进入了国内互联网巨头--Alibaba! 其实,今年下半年我面试不少互联网企业,像涂鸦智能,百度,京东,腾讯,字节,滴滴,阿里等等都有三井的 ...

  4. 京东最新Java面试真题解析!mysql两个时间比较

    为了更好的梳理相关知识,咱们先看纯手绘知识体系图 1.1 Kafka知识体系大纲 由于我手绘这些知识体系大纲是用的xmind软件,无法上传,所以都以截图的形式展示,细节处不清楚(毕竟图片形式有限) 1 ...

  5. 338页网易Java面试真题解析火爆全网,讲的明明白白!

    美团一面: 收到了HR的信息,通知我去面试,说实话真的挺紧张的.自己准备了近一个月的时间,很担心面试不过,到时候又后悔不该"裸辞". 自我介绍 spring的IOC,AOP原理 s ...

  6. 2021京东最新Java面试真题解析,java下载安装教程手机

    前言 今年我也33了,离传说中不好找工作的35岁又更近了.说没有焦虑是对自己撒谎,于是我采访了一些人,自己思考了下,写下了这篇文章,希望能有些共鸣. 先看看大家的态度: 色老力衰,不好忽悠,不能带头加 ...

  7. 华为Java面试真题解析,都是精髓!

    前言 面试时间将近两个小时(期间等待二面面试官来面我的时候等了半个多小时)面试官问的东西很多,还挖了好几个坑,一个技术点套着一个技术点的问,一定要做好万全的准备.问了一些基本层面上的技术点都答出来了, ...

  8. 2020-2021阿里巴巴Java面试真题解析,面试真题解析

    前言 本人是底层 211 本科,刚毕业,⽆科研经历,但是有些项⽬经历. 在国内监控行业某头部企业做过一段时间的实习. 想着投下字节,可以积累⼀下⾯试经验和为金九银十面招做准备.投了简历之后,过了一段时 ...

  9. 997页字节跳动Java面试真题解析火爆全网,系列教学

    前言 最近刷到了一句耐人寻味的话,"解决雪崩问题的最好办法是不发生雪崩". 不论是在硅谷互联网公司里还是在国内的互联网平台上,曾多次遇到过海量规模的交易瞬间吞噬平台的悲惨故事. 核 ...

最新文章

  1. QN8027输出调频分裂的频谱
  2. 这套“人造肌腱”装备,可保护你的老腰|Science子刊
  3. 22. loacte命令
  4. 虚拟机下Ubuntu共享主机文件(Ubuntu、VMware、共享) .
  5. postgresql-9.2beta2 安装相关
  6. flink的MemorySegment
  7. Java继承关系的类的初始化和实例化的执行顺序
  8. it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式
  9. 移动端最小字体限制测试
  10. 《HTML5+CSS3网页设计入门必读》——1.11 小结
  11. html设置flash的背景颜色,flash 如何设置舞台大小和背景颜色?
  12. 关于JavaScript(JS)
  13. 海尔简爱s11怎么进入bios_海尔笔记本如何进入BIOS设置_海尔笔记本进入bios方法...
  14. 《人工智能算法工程师(高级)》
  15. C++新特性:override
  16. 在Spring MVC框架下利用RESTful API和MongoDB实现用户留言与邮件反馈
  17. 【人生参悟】纸上得来终觉浅,绝知此事要躬行
  18. 创建TimesTen 数据库
  19. 一口气说出前后端 10 种 鉴权方案!!!
  20. 默纳克调试说明书_默纳克_NICE3000调试说明书(修改版)

热门文章

  1. 独家专访 | 从跨国投行到开源社区,IBM Spark总工程师Nick Pentreath的传奇经历
  2. 微服务架构之外的选择——基于服务架构
  3. 收藏 | 2015年度大数据应用经典案例Top100
  4. 渗透测试之全方位信息收集神器 instarecon
  5. 【华为】华为模拟器模拟静态、动态NAT、PAT技术
  6. 海量存储之十八–一致性和高可用专题
  7. With在sql server 2005中的用法
  8. H3C 7506E基于时间的分时段上网的ACL
  9. QLibrary Class Reference(qt加载外部库)
  10. 分布式系统设计原理与方案