APP下载

十分钟教你如何应对BAT等大厂的面试刁难 offer手到擒来

消息来源:baojiabao.com 作者: 发布时间:2024-06-01

报价宝综合消息十分钟教你如何应对BAT等大厂的面试刁难 offer手到擒来

有程式码的地方,就有江湖。

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

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

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

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

JVM是内功心法很重要的一块。上线出现效能问题,JVM调优更是不可回避的事情。但又因Java虚拟机器封装得太好,让我们几乎感觉不到它的存在,可 学习Java虚拟机器对于高阶程序员来说,其重要性是不言而喻的。

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

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

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

Java程式码是怎么执行的?

Java虚拟机器是如何载入Java类的?

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

如何理解JVM内建的编译或GC日志?

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

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

JVM是如何实现同步的?

Java内在模型是什么?

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

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

如何利用字节码注入为已有程式码加料?

我挑选了几个问题进行解答,希望能对大家面试起到帮助。顺便提一句:更多精彩JVM以及Java相关技术讲解可以加Qun:1017-599-436获取,包括电子书,PDF文件以及视讯精讲。

1、Java程式码是怎么执行的?

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

为什么Java要在虚拟机器里执行?

Java虚拟机器具体是怎样执行Java字节码的?

Java虚拟机器的执行效率究竟是怎么样的?

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

Java虚拟机器将执行时内存区域划分为五个部分,分别为方法区、堆、PC暂存器、Java方法栈和本地方法栈。Java程式编译而成的class档案,需要先载入至方法区中,方能在Java虚拟机器中执行。

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

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

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

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

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

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

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

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

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

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

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

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

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

传统的垃圾回收算法在标记、清除过程中需要中止其他应用执行绪,即所谓的Stop-The-World。新型的垃圾回收算法,如CMS、G1以及ZGC,尽可能地实现并发标记、清除,从而让Stop-The-World的时间长度可控。垃圾回收的另一基础思想则是分代回收。 JVM会将新生成的物件划为新生代,而将在多次垃圾回收中存活下来的物件划为老年代。JVM会为不同的分代设定不同的回收算法,从而达到新生代多收集、快收集,老年代少收集、全收集的目标。

5、JVM垃圾回收算法

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

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

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

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

…… 更多精彩JVM以及Java相关技术讲解可以加Qun:1017-599-436获取,包括电子书,PDF文件以及视讯精讲。

2020-01-16 16:51:00

相关文章