当前位置:   article > 正文

结合JAVA面试题,深入理解JAVA(一)_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
  • 1

告诉JVM只进行解释执行,完全放弃代码编译,抛弃了JIT带来性能优势;
与其相对应的还有

-Xcomp
  • 1

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

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

关注公众号,获取更多资源
关注公众号,获取更多java资源

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/662452
推荐阅读
相关标签
  

闽ICP备14008679号