Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第1讲 | 谈谈你对Java平台的理解?

G1
CMS
Parallel GC
SerialGC
初始化
链接
验证
加载
Extension Class-loader
Application Class-loader
Bootstrap Class-loader
Jython
JRuby
Groovy
Scala
Clojure
jaotc工具
Oracle JDK 9的AOT特性
-Xcomp
-Xint
诊断和监控工具
安全工具
运行时环境
编译器
常见垃圾收集器
基本原理
自定义Class-Loader
类加载过程
类加载机制
安全
并发
网络
IO/NIO
集合
Lambda
泛型
JVM上的其他语言
AOT编译
Java虚拟机启动参数
JDK工具和其他工具
垃圾收集
JVM基础概念和机制
基础类库
Java语言特性
知识扩展
典型回答
参考文章

该思维导图由 AI 生成,仅供参考

从你接触 Java 开发到现在,你对 Java 最直观的印象是什么呢?是它宣传的 “Write once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度?请你先停下来总结思考一下。
今天我要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?

典型回答

Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write 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 提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。

考点分析

其实这个问题,问得有点笼统。题目本身是非常开放的,往往考察的是多个方面,比如,基础知识理解是否很清楚;是否掌握 Java 平台主要模块和运行原理等。很多面试者会在这种问题上吃亏,稍微紧张了一下,不知道从何说起,就给出个很简略的回答。
对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java 知识理解得也比较全面一定要避免让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java平台是一种面向对象的编程语言,最显著的特性包括“Write once, run anywhere”和垃圾收集。Java的运行环境包括JRE和JDK,其中JDK是JRE的超集,提供了更多工具和编译器。关于“Java是解释执行”的说法并不准确,实际上,Java源代码首先通过编译器编译成字节码,然后在运行时通过Java虚拟机(JVM)内嵌的解释器将字节码转换成机器码。此外,JVM还提供了JIT编译器,能够在运行时将热点代码编译成机器码,实现编译执行。文章还介绍了Java平台的其他方面,如语言特性、基础类库、JVM的基础概念和机制,以及JDK包含的工具等。此外,还探讨了Java虚拟机的启动参数和不同的运行模式选择,以及新的编译方式AOT。文章最后鼓励读者对Java平台的理解进行思考,并分享给朋友。整体而言,文章涵盖了Java平台的多个方面,对于想要快速了解Java平台的读者来说,是一份全面而有深度的技术概览。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(344)

  • 最新
  • 精选
  • Woj
    “一次编译、到处运行”说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平台都有相应的JDK,安装好JDK后也就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大的差异,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言运行的环境而已,所以才有了Java一次编译,到处运行这样的效果。 严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。“一次编译,到处运行”这种效果跟编译器有关。编程语言的处理需要编译器和解释器。Java虚拟机和DOS类似,相当于一个供程序运行的平台。 程序从源代码到运行的三个阶段:编码——编译——运行——调试。Java在编译阶段则体现了跨平台的特点。编译过程大概是这样的:首先是将Java源代码转化成.CLASS文件字节码,这是第一次编译。.class文件就是可以到处运行的文件。然后Java字节码会被转化为目标机器代码,这是是由JVM来执行的,即Java的第二次编译。 “到处运行”的关键和前提就是JVM。因为在第二次编译中JVM起着关键作用。在可以运行Java虚拟机的地方都内含着一个JVM操作系统。从而使JAVA提供了各种不同平台上的虚拟机制,因此实现了“到处运行”的效果。需要强调的一点是,java并不是编译机制,而是解释机制。Java字节码的设计充分考虑了JIT这一即时编译方式,可以将字节码直接转化成高性能的本地机器码,这同样是虚拟机的一个构成部分。

    作者回复: 高手

    2018-05-05
    19
    1057
  • magict4
    我对『Compile once, run anywhere』这个宣传语提出的历史背景非常感兴趣。这个宣传语似乎在暗示 C 语言有一个缺点:对于每一个不同的平台,源代码都要被编译一次。我不解的地方是,为什么这会是一个问题?不同的平台,可执行的机器码必然是不一样的。源代码自然需要依据不同的平台分别被编译。 我觉得真正问题不在编译这一块,而是在 C 语言源文件这一块。我没有 C 语言的编程经验,但是似乎 C 语言程序经常需要调用操作系统层面的 API。不同的操作系统,API 一般不同。为了支持多平台,C 语言程序的源文件需要根据不同平台修改多次。这应该是一个非常大的痛点。我回头查了一下当时的宣传语,原文是『Write once, run anywhere』,焦点似乎并不在编译上,而是在对源文件的修改上。 以上是自己一点不成熟的想法,还请大家指正!

    作者回复: 汗颜,是我记错了,非常感谢指正

    2018-05-05
    14
    603
  • 三军
    Java特性: 面向对象(封装,继承,多态) 平台无关性(JVM运行.class文件) 语言(泛型,Lambda) 类库(集合,并发,网络,IO/NIO) JRE(Java运行环境,JVM,类库) JDK(Java开发工具,包括JRE,javac,诊断工具) Java是解析运行吗? 不正确! 1,Java源代码经过Javac编译成.class文件 2,.class文件经JVM解析或编译运行。 (1)解析:.class文件经过JVM内嵌的解析器解析执行。 (2)编译:存在JIT编译器(Just In Time Compile 即时编译器)把经常运行的代码作为"热点代码"编译与本地平台相关的机器码,并进行各种层次的优化。 (3)AOT编译器: Java 9提供的直接将所有代码编译成机器码执行。

    作者回复: 精辟

    2018-05-05
    5
    465
  • Jerry银银
    关注了好久,终于期盼到了第一讲。 在看到这个题目时,我并没有立马点进来看原文,而是给了自己一些时间进行思考。 首先,个人觉得这个题目非常的抽象和笼统,这个问题没有标准答案,但是有『好』答案,而答案的好坏,完全取决于面试者自身的技术素养和对Java系统性的了解。我的理解如下: 宏观角度: 跟c/c++最大的不同点在于,c/c++编程是面向操作系统的,需要开发者极大地关心不同操作系统之间的差异性;而Java平台通过虚拟机屏蔽了操作系统的底层细节,使得开发者无需过多地关心不同操作系统之间的差异性。 通过增加一个间接的中间层来进行”解耦“是计算机领域非常常用的一种”艺术手法“,虚拟机是这样,操作系统是这样,HTTP也是这样。 Java平台已经形成了一个生态系统,在这个生态系统中,有着诸多的研究领域和应用领域: 1. 虚拟机、编译技术的研究(例如:GC优化、JIT、AOT等):对效率的追求是人类的另一个天性之一 2. Java语言本身的优化 3. 大数据处理 4. Java并发编程 5. 客户端开发(例如:Android平台) 6. ...... 微观角度: Java平台中有两大核心: 1. Java语言本身、JDK中所提供的核心类库和相关工具 2. Java虚拟机以及其他包含的GC 1. Java语言本身、JDK中所提供的核心类库和相关工具 从事Java平台的开发,掌握Java语言、核心类库以及相关工具是必须的,我觉得这是基础中的基础。 >> 对语言本身的了解,需要开发者非常熟悉语言的语法结构;而Java又是一种面对对象的语言,这又需要开发者深入了解面对对象的设计理念; >> Java核心类库包含集合类、线程相关类、IO、NIO、J.U.C并发包等; >> JDK提供的工具包含:基本的编译工具、虚拟机性能检测相关工具等。 2. Java虚拟机 Java语言具有跨平台的特性,也正是因为虚拟机的存在。Java源文件被编译成字节码,被虚拟机加载后执行。这里隐含的意思有两层: 1)大部分情况下,编程者只需要关心Java语言本身,而无需特意关心底层细节。包括对内存的分配和回收,也全权交给了GC。 2)对于虚拟机而言,只要是符合规范的字节码,它们都能被加载执行,当然,能正常运行的程序光满足这点是不行的,程序本身需要保证在运行时不出现异常。所以,Scala、Kotlin、Jython等语言也可以跑在虚拟机上。 围绕虚拟机的效率问题展开,将涉及到一些优化技术,例如:JIT、AOT。因为如果虚拟机加载字节码后,完全进行解释执行,这势必会影响执行效率。所以,对于这个运行环节,虚拟机会进行一些优化处理,例如JIT技术,会将某些运行特别频繁的代码编译成机器码。而AOT技术,是在运行前,通过工具直接将字节码转换为机器码。

    作者回复: 👍

    2018-05-06
    11
    260
  • 姜亮
    写个程序直接执行字节码就是解释执行。写个程序运行时把字节码动态翻译成机器码就是jit。写个程序把java源代码直接翻译为机器码就是aot。造个CPU直接执行字节码,字节码就是机器码。

    作者回复: 好主意,当年确实有类似项目

    2018-05-07
    5
    183
  • 欧阳田
    1,JVM的内存模型,堆、栈、方法区;字节码的跨平台性;对象在JVM中的强引用,弱引用,软引用,虚引用,是否可用finalise方法救救它?;双亲委派进行类加载,什么是双亲呢?双亲就是多亲,一份文档由我加载,然后你也加载,这份文档在JVM中是一样的吗?;多态思想是Java需要最核心的概念,也是面向对象的行为的一个最好诠释;理解方法重载与重写在内存中的执行流程,怎么定位到这个具体方法的。2,发展流程,JDK5(重写bug),JDK6(商用最稳定版),JDK7(switch的字符串支持),JDK8(函数式编程),一直在发展进化。3,理解祖先类Object,它的行为是怎样与现实生活连接起来的。4,理解23种设计模式,因为它是道与术的结合体。

    作者回复: 高手

    2018-05-05
    6
    156
  • zaiweiwoaini
    看评论也能学习知识。

    作者回复: 搬个板凳,哈哈

    2018-05-05
    129
  • 刻苦滴涛涛
    我理解的java程序执行步骤: 首先javac编译器将源代码编译成字节码。 然后jvm类加载器加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度相对会比较慢。有些方法和代码块是高频率调用的,也就是所谓的热点代码,所以引进jit技术,提前将这类字节码直接编译成本地机器码。这样类似于缓存技术,运行时再遇到这类代码直接可以执行,而不是先解释后执行。

    作者回复: 不错,JIT是运行时编译

    2018-05-05
    5
    100
  • thinkers
    jre为java提供了必要的运行时环境,jdk为java提供了必要的开发环境!

    作者回复: 剧透一下,未来jre将退出历史舞台!

    2018-05-05
    4
    99
  • scott
    解释执行和编译执行有何区别

    作者回复: 类比一下,一个是同声传译,一个是放录音

    2018-05-07
    3
    85
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部