结合Java面试题,深入理解Java

Posted 奔跑的小宝宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结合Java面试题,深入理解Java相关的知识,希望对你有一定的参考价值。

都是小白自己整理,自己的看法(留下笔记,哈哈),请大佬们指教


问:

谈谈你对Java平台的理解?“java是解释执行”,这句话正确吗?

首先,这个问题是考面试者对java学习是否系统化,知识是否结构化,所以,回答该类问题时,要表现出自己的思维深入并且系统化。下图是我个人总结的点。


我个人的回答如下:

个人印象比较深刻的是“Write once,run anywhere”,也就是java的平台无关性,非常容易获得跨平台运行的能力;其次就是,java是一种面向对象语言,具有泛型,Lambada,反射等特点。我们日常接触的会有JRE或者JDK。JRE是Java运行环境,包含了JVM以及各种类库;而JDK可以看作JRE的超集,包含着JRE还有编译器,诊断工具,检测工具等。JVM中的GC,也就是垃圾收集器,因为这个GC的存在,大部分情况下,程序员并不需要操心内存的分配与回收。


对于,“java是解释执行”,个人认为这句话不正确。

我们编写的Java代码,会编译成字节码,这里的编译与C/C++是不一样的,C/C++在不同的平台,代码要重新编译一次,而Java只需要编译一次,得到字节码文件(.class),然后依赖JVM内嵌的解释器,编译成机器码。(这也是JAVA跨平台的基础。)


但是我们日常用的JVM,大多数情况都是使用Oracle JDK提供的Hotspot JVM,都提供的JIT(Just-In-Time)编译器,即动态编译器。JIT能在运行时将热点代码(重复率高的代码),编译成机器码,并缓存,这种情况下的热点代码,属于编译执行,而不是解释执行。而在JDK9中,引入了一实验特性,新的编译方式——AOT(Ahead-of-Time Compilation),直接将字节码编译成机器码,不通过解释器。所以,这句话并不正确。


通常,面试官会刨根问底,所以,对图中的一些机制,重要类库也需要好好掌握,我在此也做一些知识拓展的笔记:

HR可能会对JVM的一些机制进行追问,例如Java类的加载机制,例如JDK8内嵌的Class-Loader;类加载大致过程:加载、验证、链接、初始化;自定义Class-Loader等。还有垃圾收集的基本原理,最常见的垃圾收集器,如SerialGC、Parallel、CMS、G1等等,适用于什么样的工作负载,心里也要有数。


在运行时,JVM会用过类加载器(Class-Loader)加载字节码,解释或者编译执行。就像我前面提到的JIT,主流的java版本中,如JDK8实际上是解释和编译混合的一种模式,就是所谓的混合模式(-Xmixed)。JVM有两种运行模式,一种是server模式,在该模式下,JVM会进行上万次调用以收集足够的信息进行高效的编译;另一种是client模式,这个模式的调用门限是1500次。Oracle Hotspot JVM内置了两种不同的JIT compiler。第一种即C1,对应的是client模式,适用于对启动速度敏感的应用;C2对应的是server模式,它的优化是为长时间运行的服务器端应用设计的,默认采用所谓的分层编译(不一一解释了,不然写不完了这文章,后面提到相关内容时,再详细解释)。


JVM启动时,可以指定不同的参数对运行模式进行选择。比如:

-Xint

告诉JVM只进行解释执行,完全放弃代码编译,抛弃了JIT带来性能优势;

与其相对应的还有

-Xcomp

即关闭解释,不进行解释执行,亦成为最大优化级别。但是这种模式真的是不是高效,那可不一定。该语句会导致JVM启动变慢非常多。


还有文中的AOT模式,如果你了解安卓的ART,那对它也会有一定了解。在JDK9中,引入了该特性,并且提供了jaotc工具,利用命令把某个类或者模块编译成AOT库。而且,Oracle JDK支持分层编译和AOT协作使用。



给我【好看】

你也越好看!



以上是关于结合Java面试题,深入理解Java的主要内容,如果未能解决你的问题,请参考以下文章

面试题深入理解Java虚拟机

每天一道面试题:深入理解Java虚拟机系列

深入理解JVM:掌握这套精编Java高级面试题解析,看完跪了

Java数据结构二叉树进阶——非递归实现前中后序遍历二叉树(深入理解二叉树)+进阶大厂面试题(一行一注释)

深入理解JVM虚拟机13:JVM面试题,看这篇就足够了(87题详解)

从一道面试题来认识java类加载时机与过程