皆非的万事屋 - 面试
type: channel
link: http://makeyourchoice.cn/tag/%E9%9D%A2%E8%AF%95/
items: 【Java核心36讲】第一讲——谈谈你对Java平台的理解

【Java核心36讲】第一讲——谈谈你对Java平台的理解
type: item
date: 2021-01-30T01:24:00+00:00
description: 从你接触java开发到现在，你对Java平台到底了解到什么程度？ [scode type="yellow"]问题：谈谈你对Java平台的理解？“Java是解释执行”，这句话正确吗？[/scode] 典型回答 Java本身是一种面向对象的语言，最显著的特性又两个方面： 一是所谓的“书写一次，到处运行”，跨平台能力强 二是垃圾收集(GC,Garbage Collection)，Java通过垃圾收集器回收分配内存，大部分情况下，程序员不需要自己操心内存的分配和回收。 我们日常会接触到JRE（Java Runtime Environment）或者JDK（Java Development Kit）。JRE也就是Java运行环境，包含了JVM和java类库，以及一些模块等。而JDK可以看作是JRE的一个超集，提供了更多工具，比如编译器、各种诊断工具等。 对于“Java是解释执行”这句话，这个说法不太准确。我们开发的Java的源代码，首先通过Javac编译成为字节码（bytecode），然后，在运行时，通过Java虚拟机（JVM）内嵌的解释器将字节码转换成为最终的机器码。 但是常见的JVM，比如我们大多数情况使用的Oracle JDK提供的 Hotspot JVM，都提供了JIT(Hust-In-Time)编译器，也就是通常所说的动态编译器，JIT能够在运行时将热点代码编译成机器码，这种情况下部分热点代码就属于编译执行，而不是解释执行了。 考点分析 其实这个问题，问得有点笼统。题目本身是非常开放的，往往考察的是多个方面，比如，基础知识理解是否很清楚；是否掌握Java平台主要模块和运行原理等。很多面试者会在这种问题上吃亏，稍微紧张了一下，不知从何说起，就给出个很简略的回答。 对于这类笼统的问题，你需要尽量表现出自己的思维深入并系统化，Java知识理解得也比较全面，一定要避免让面试官觉得你是个“知其然不知其所以然”得人。 毕竟明白基本组成和机制，是日常工作中进行问题诊断或者性能调优等很多事情得基础，相信没有招聘方会不喜欢“热爱学习和思考”得面试者。 即使感觉自己得回答不是非常完善，也不用担心。我个人觉得这种笼统的问题，有时候回答得稍微片面也很正常，大多数有经验得面试官，不会因为一道题就对面试者轻易地下结论。通常会尽量引导面试者，把他得真实水平展现出来，这种问题就是做个开场热身，面试官经常会根据你的回答扩展相关问题。 知识扩展 回归整体，对于Java平台得理解，可以从很多方面简明扼要地谈一下，例如： Java语言特性，包括泛型、Lambda等语言特性 基础类库，包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多地类库 对于我们日常工作应用较多地类库，面试前可以系统化总结一下，有助于临场发挥。 或者谈谈JVM地一些基础概念和机制，比如Java的类加载机制，常用版本JDK（如JDK 8）内嵌的Class-Loader，例如Bootstarp、Application和Extension Class-loader；类加在大致过程： [scode type="blue"]加载、验证、链接、初始化（参考《深入理解Java虚拟机》）、自定 Class-Loader等。[/scode] 还有垃圾收集的基本原理，最常见的垃圾收集器，如 [scode type="blue"]SerialGC、Parallel GC、 CMS、G1[/scode] 对于适用于什么样的工作负载最好心里也有数。这些都是可以扩展的领域，我会在后面的专栏对此进行系统的介绍。 当然还有JDK包含哪些工具或者Java领域内其他工具等，如 [scode type="blue"]编译器、运行时环境、安全工具、诊断和监控工具[/scode] 这些基本工具是日常工作效率的保证，对于我们工作在其他语言平台上，同样有所帮助，很多都是触类旁通的。 下图是我总结的一个相对宽泛的蓝图供你参考： 不再扩展了，回到前面问到的解释执行和编译执行的问题。有些面试官喜欢在特定问题上“刨根问底儿”，因为这是进一步了解面试者对知识掌握程度的有效方法，我稍微深入探讨一下。 众所周知，我们通常把Java分为编译期和运行时。这里说的Java的编译和C/C++是有着不同的意义的，Javac的编译，编译Java源码生成“.class”文件里面实际是字节码，而不是可以直接执行的机器码。 [scode type="yellow"]Java通过字节码和Java虚拟机（JVM）这种跨平台的抽象，屏蔽了操作系统和硬件的细节，这也是实现“一次编译，到处执行”的基础。[/scode] 在运行时，JVM会通过类加载器（Class-Loader）加载字节码，解释或者编译执行。就像我前面提到的，主流Java版本中，如JDK8实际是…