从你接触 Java开发到如今,你对 Java最直观的印象是什么呢?是它宣传的 “Compile once, run anywhere”,仍是目前看已经有些过于形式主义的语法呢?你对于 Java平台到底了解到什么程度?请你先停下来总结思考一下。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库。
而后,在启动时直接指定就能够了。
并且,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高级群 :725633148 里面会分享一些资深架构师录制的视频录像:(有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构)等这些成为架构师必备的知识体系 进群立刻免费领取,目前受益良多!