有代码的地方,就有江湖。

程序员,就是“一人,一键,二机”行走其间的孤独剑客。在江湖中狂荡,必然要练就绝世武功,则需要内外兼备:精妙的招式,加之深厚的内功。武功的基础是内功,一个内功低的人招式再奇妙,也打不过一个内功深厚之人。同样两者也是相辅相成,内功深厚,原来的一招一式威力也会倍增。

对于开发者来说,其道理也是一样。流行的框架越来越多,封装也越来越完善,各种框架可以搞定一切。

初级程序员只要熟悉基本的使用方法,几乎不用关注底层的实现,便可以快速地开发上线。

但对于想要进阶的你来说,更要注重内功,比如算法、设计模式、底层原理等等。只有把基础打扎实,才能知其然知其所以然,出现Bug能快速发现问题本质。

作者郑雨迪在Java虚拟机性能优化方面有着多年的研究,深知JVM是内功心法很重要的一块。上线出现性能问题,JVM调优更是不可回避的事情。但又因Java虚拟机封装得太好,让我们几乎感觉不到它的存在,可学习Java虚拟机对于高级程序员来说,其重要性是不言而喻的。

我司在面试高级开发的时候,JVM相关知识也必定是考核的标准之一。

下面这篇文章集锦了阿里、美团、Oracle等大厂的JVM考点,你看看是否会能答得上来?

  1. 为什么Java被称作是“平台无关的编程语言”?

  2. Java代码是怎么运行的?

  3. Java虚拟机是如何加载Java类的?

  4. 如何监控和诊断JVM堆内和堆外内存使用?

  5. 如何理解JVM内置的编译或GC日志?

  6. JVM的永久代中会发生垃圾回收么?

  7. Java中的两种异常类型是什么?他们有什么区别?

  8. JVM是如何实现同步的?

  9. Java内在模型是什么?

  10. 即时编译器有哪些优化?在什么情况下重复读写操作会被优化?

  11. 什么样的垃圾才被回收?什么时候会导致垃圾回收?

  12. 如何利用字节码注入为已有代码加料?

……

根据郑雨迪专栏《深入拆解Java虚拟机》的内容,我挑选了几个问题进行解答,希望能对大家面试起到帮助。顺便提一句,《深入拆解Java虚拟机》已有 2.6 w+订阅,今天也有特惠活动。

画外音:

特意向极客时间运营小姐姐申请了福利,《深入拆解Java虚拟机》限时优惠79,原价99,仅限今天一天,有兴趣的可以拉到后面。

1、Java代码是怎么运行的?

这个问题可以分三块来回答:

  • 为什么Java要在虚拟机里运行?

  • Java虚拟机具体是怎样运行Java字节码的?

  • Java虚拟机的运行效率究竟是怎么样的?

Java之所以要在虚拟机中运行,是因为它提供了可移植性。一旦Java代码被编译为Java字节码,便可以在不同平台上的Java虚拟机实现上运行。此外,虚拟机还提供了一个代码托管的环境,代替我们处理部分冗长而且容易出错的事务,例如内存管理。

Java虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC寄存器、Java方法栈和本地方法栈。Java程序编译而成的class文件,需要先加载至方法区中,方能在Java虚拟机中运行。

为了提高运行效率,标准JDK中的HotSpot虚拟机采用的是一种混合执行的策略。首先,它会解释执行Java字节码,然后会将其中反复执行的热点代码,以方法为单位进行即时编译,翻译成机器码后直接运行在底层硬件之上。HotSpot装载了多个不同的即时编译器,以便在编译时间和生成代码的执行效率之间做取舍。

画外音:

参考《深入拆解Java虚拟机》的文章:「Java代码是怎么运行的?」

2、Java虚拟机是如何加载Java类的?

Java虚拟机将字节流转化为Java类的过程,可分为加载、链接以及初始化三大步骤。也可以用盖房子来类比Java虚拟机中的类加载。

  • 加载是指查找字节流,并且据此创建类的过程。以盖房子为例,村里的Tony要盖个房子,那么按照流程他得先找个建筑师,跟他说想要设计一个房型,比如说“一房、一厅、四卫”。这里的房型相当于类,而建筑师,就相当于类加载器。村里有许多建筑师,他们等级森严,但有着共同的祖师爷,叫启动类加载器(boot class loader)。

加载需要借助类加载器,在Java虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器。

  • 链接,是指将创建成的类合并至Java虚拟机中,使之能够执行的过程。链接还分验证、准备和解析三个阶段。其中,解析阶段为非必须的。

  • 初始化,则是为标记为常量值的字段赋值,以及执行<clinit>方法的过程。类的初始化仅会被执行一次,这个特性被用来实现单例的延迟初始化。这放在我们盖房子的例子中就是,只有当房子装修过后,Tony才能真正地住进去。

3、异常捕获是如何实现的?

在编译生成的Java字节码中,每个方法都附带一个异常表。异常表中的每一行均定义了一条异常执行路径,其中包括规定捕获范围的起始字节码索引、终止(不包含)字节码索引,异常处理代码的起始字节码索引,以及所捕获的异常类型。

当程序触发异常时,JVM会从上至下遍历异常表中的所有条目。当触发异常的字节码的索引值在某行异常表条目的捕获范围内,JVM会判断所抛出的异常和该条目想要捕获的异常是否匹配。如果匹配,JVM会将控制流转移至该条目所指向的异常处理代码。

上述异常捕获机制还被用于finally从句的实现。通常,Java程序的编译器javac会复制多份finally代码块,放置于生成的Java字节码之中,然后通过生成多行异常表条目,来实现完整的finally逻辑。

 

画外音:

这个问题可以看下《深入拆解Java虚拟机》的「JVM是如何处理异常的?」,有做更加详细的讲解。

4、垃圾回收的基础思想是什么?

目前JVM的主流垃圾回收器采取的都是可达性分析算法。该算法的实质是将一系列被称为GC Roots的对象作为初始的存活对象合集,然后从该合集出发探索所有能够被该集合引用到的对象,并标记为存活对象。当标记阶段结束之后,未被标记到的对象便是可以清除的。

传统的垃圾回收算法在标记、清除过程中需要中止其他应用线程,即所谓的Stop-The-World。新型的垃圾回收算法,如CMS、G1以及ZGC,尽可能地实现并发标记、清除,从而让Stop-The-World的时间长度可控。

垃圾回收的另一基础思想则是分代回收。JVM会将新生成的对象划为新生代,而将在多次垃圾回收中存活下来的对象划为老年代。JVM会为不同的分代设置不同的回收算法,从而达到新生代多收集、快收集,老年代少收集、全收集的目标。

画外音:

这里可以看下《深入拆解Java虚拟机》的「 垃圾回收(上)」这篇文章,有做更加详细的讲解。

5、JVM垃圾回收算法

  • 标记-清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

  • 复制算法:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当一块内存用完了,将还存另外一块上面,然后在把已使用过的内存空间一次清理掉。

  • 标记-整理算法:标记过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所一端移动,然后直接清理掉端边界以外的内存。

  • 分代收集算法:一般是把Java堆分为新生代和老年代,根据各个年代的特点采用最适当的收集算法。新生代都发现有大批对象死去,选用复制算法。老年代中因为对象存活率高,必须使用“标记-清理”或“标记-整理”算法来进行回收。

……更多精彩JVM讲解,推荐订阅他的专栏《深入拆解Java虚拟机》,手把手带你掌握JVM,打通Java最底层。

先简单介绍下作者:郑雨迪, Oracle Labs 高级研究员,主要负责研究如何通过程序分析技术以及动态编译技术让程序语言跑得更快。他也是 Graal 编译器的核心开发者之一,同时在为 HotSpot 虚拟机项目“添砖加瓦”。

可以说,在JVM领域,雨迪确实有着极深的研究经验,这样子的牛人能出来开课,真的是难得。

《深入拆解Java虚拟机》这个专栏订阅量一直稳居极客时间 top 5,现在已经 2.6 w+订阅。

雨迪从底层出发,通过揭秘 Java 虚拟机的工作原理及运行机制,掌握诊断手法和题调优方式。通过这个专栏的学习,你将了解如何编写高效的代码,如何对 Bug 达到最优处理,以及如何针对自己的应用调整虚拟机的运营参数。

今儿特意刷脸给大家要了一个限时 24 小时的优惠福利,限时优惠只要 79 元,原价 99 元,立省 20。

这个专栏除了内容硬核外,互动和反馈也是非常吸引人的两个点。换句接地气的话说:“就是找到组织的感觉”。

1、每篇文章作者都会留下一个思考题,帮助大家更好吸收知识。

举个例子,在「第 6 篇 | JVM 是如何处理异常的?」中,作者讲解了 Java 虚拟机异常处理的机制,并留下了思考题:

2、在留言区,你能看到大家各种各样的解题思路,其中有的你可能会意想不到,可以说,在留言区你也能学到很多。郑雨迪也会留言回复,解答大家提出的问题,或者给予及时反馈。

下面给大家截了部分读者评价,你可以参考。

可以点击看大图

再强调一遍,《深入拆解Java虚拟机》仅限今天优惠 79,已有超过 2.5 w人加入学习,想认真进阶 Java 的同学,请抓紧搭上这趟福利车。

???

优惠仅今天一天

限时优惠 79,原价 99

一场电影的价格

跟着 Oracle 大佬系统掌握 Java 虚拟机!

点击「阅读原文」,免费试看!

阿里、美团、Oracle等大厂的Java虚拟机面试题集锦相关推荐

  1. 【面试题】Java常见面试题集锦

    Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...

  2. 2011-2012年腾讯,创新工场,淘宝,百度,阿里,迅雷。网易游戏校园招聘面试题集锦(1-25题含答案)

    2011-2012年腾讯,创新工场,淘宝,百度,阿里,迅雷.网易游戏校园招聘面试题集锦(1-25题含答案) 又是一年招聘季,小鸟我也在本季参加招聘,所以特在网上和群里面这里去年和今年的面试题,以备战招 ...

  3. java底层原理书籍_不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收...

    概述 JVM 的内存模型和 JVM 的垃圾回收机制一直是 Java 业内从业者绕不开的话题(实际调优.面试)JVM是java中很重要的一块知识,也是面试常问的问题之一,直至今天,仍然还有许多面试者在被 ...

  4. java epoll select_最新阿里、拼多多、快手Java岗面试题269 道送答案

    Java面试,是对技术知识栈的梳理.考核.复盘 每一次Java面试,其实都是一次学习机会,是对自己技术知识栈的梳理.考核.复盘.我们应该抱着学习的态度,认真对待,找到自己比较薄弱的环节,尽快去查漏补缺 ...

  5. 精选 2021 年大厂高频 Java 面试真题集锦(含答案),面试一路开挂

    本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的 Java 面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样 ...

  6. 精选2022年大厂高频Java面试真题集锦(含答案),面试一路开挂

    本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样会研 ...

  7. 经典的Java基础面试题集锦

    问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示"main方法不是public的". 问题:Java里的传引用和传值的区别是什么? 答案: ...

  8. ChatGPT 整理的 “Java基础面试题集锦:完全版“ (1)

    user: 你学习编程的目的是什么?学习编程最快的办法是什么? assistant: 我作为AI语言模型并不会有个人目的,但是就一般用户而言,学习编程的目的可以有很多种,比如为了就业.提高自己的技能水 ...

  9. Java实习生面试题集锦

    今天小编总结了一些关于Java的面试题,希望能帮助到正在求职的你! 1.Java的数据结构你用过那些?map与set的本质区别是什么 数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合. 依 ...

  10. 阿里最新秋招面经,腾讯/美团/字节1万道Java中高级面试题

    又是一年过去了,职场的积雪还没有消融,又迎来了一次大考.疫情还没完全过去,大家强打起精神,相互问好致意,眼角却满是疲惫- 企业调薪.裁员.组织架构调整等等,坏消息只多不少,最近也有很多来咨询跳槽的朋友 ...

最新文章

  1. gradle新建工程,多项目依赖,聚合工程
  2. 从零开始在ubuntu上安装和使用k8s集群及报错解决
  3. AI领域五年引用量最高的10大论文:Adam登顶,AlphaGo、Transfromer上榜
  4. 第十四节: 介绍四大并发集合类并结合单例模式下的队列来说明线程安全和非安全的场景及补充性能调优问题。...
  5. python的中文含义-python关键字以及含义,用法
  6. hashmap取值_一万六千字的HashMap深度剖析
  7. mongodb与java结合_MongoDB初探系列之四:MongoDB与Java共舞
  8. 面试官:说说Java中java.lang.Void和void有什么作用和区别?
  9. 【BZOJ3930】选数(莫比乌斯反演倍数形式,杜教筛)
  10. 【算法分析与设计】辗转相除法
  11. 【报告分享】2020中国数字化后浪:中小企业转型与创新实录.pdf(附下载链接)...
  12. <c++STL>: map的常见用法
  13. mysql 官方docker_用docker安装官方mysql
  14. SparkMLlib之二Basic Stastics
  15. 模电——硬件选择电容的耐压值以及分类和其优缺点
  16. CVPR 2019 论文汇总(按方向划分,0514 更新中)-转载
  17. 软考中级软件设计师易错点整理
  18. vue中a标签的href属性的写法
  19. 3ds Max 实验十五 UV展开综合运用
  20. 为什么要进行实名认证?如何实名认证?

热门文章

  1. 计算机笔记本电脑加固态硬盘,笔记本固态硬盘,教您怎么给笔记本加固态硬盘...
  2. 共享换电:车企筑垒,宁王拆墙
  3. Symbol数据类型
  4. 为什么很多单片机的工作电压是5v?
  5. 函数柯里化curry 与合成函数 compose
  6. 修改db_create_file_dest
  7. 智能操控装置在高压开关柜中的应用
  8. Greenplum外表gpfdist加载数据
  9. 坚持十年博客写作,不忘初心,方得始终
  10. windows XP下openbravo ERP 2.40安装手迹