您好,欢迎进入华体会体育华体会体育电动伸缩门有限公司官网!
华体会体育首页|官网

联系我们

邮箱:admin@shuyangol.com
电话:058-30744676
地址:江苏省淮安市五原县蒂最大楼3622号 在线咨询

行业动态

金三银四面试季—20道精选JVM重点面试问题(含谜底)!

发布日期:2021-11-15 02:34浏览次数:
本文摘要:JVM 是小白 Java 法式员发展路上的一道坎也是许多事情2到3年法式员的一个重点面试问题之一,学习JVM之前,只需要知道代码编译成 Class,虚拟机加载 Class 运行就可以了,学习 JVM 之后,可以深入明白代码从编译到加载的历程、内存中工具的建立与垃圾接纳、日常开发中快速定位性能问题等,固然也是面试不行缺少的加分项。

华体会体育

JVM 是小白 Java 法式员发展路上的一道坎也是许多事情2到3年法式员的一个重点面试问题之一,学习JVM之前,只需要知道代码编译成 Class,虚拟机加载 Class 运行就可以了,学习 JVM 之后,可以深入明白代码从编译到加载的历程、内存中工具的建立与垃圾接纳、日常开发中快速定位性能问题等,固然也是面试不行缺少的加分项。在这我整理20道精选的JVM面试题分享给大家,希望能资助到大家同时可以给此文点个喜欢,后续会更新Java面试常问的一些问题,有兴趣的朋侪可以连续关注下我,多谢支持!面试问题如下(文末有我的一些JVM学习条记):1.Java 类加载历程?答:Java 类加载需要履历一下 7 个历程:1. 加载加载是类加载的第一个历程,在这个阶段,将完成一下三件事情:通过一个类的全限命名获取该类的二进制流。将该二进制流中的静态存储结构转化为方法去运行时数据结构。

在内存中生成该类的 Class 工具,作为该类的数据会见入口。2. 验证验证的目的是为了确保 Class 文件的字节省中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证:文件花样验证:验证字节省是否切合 Class 文件的规范,如主次版本号是否在当前虚拟机规模内,常量池中的常量是否有不被支持的类型.元数据验证:对字节码形貌的信息举行语义分析,如这个类是否有父类,是否集成了不被继续的类等。字节码验证:是整个验证历程中最庞大的一个阶段,通过验证数据流和控制流的分析,确定法式语义是否正确,主要针对方法体的验证。

如:方法中的类型转换是否正确,跳转指令是否正确等。符号引用验证:这个行动在后面的剖析历程中发生,主要是为了确保剖析行动能正确执行。3. 准备准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中举行分配。

准备阶段不分配类中的实例变量的内存,实例变量将会在工具实例化时随着工具一起分配在 Java 堆中。public static int value =123;//在准备阶段value初始值为0。在初始化阶段才会变为123。

4. 剖析该阶段主要完成符号引用到直接引用的转换行动。剖析行动并纷歧定在初始化行动完成之前,也有可能在初始化之后。5. 初始化初始化时类加载的最后一步,前面的类加载历程,除了在加载阶段用户应用法式可以通过自界说类加载器到场之外,其余行动完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中界说的 Java 法式代码。

6. 使用7. 卸载2.形貌一下 JVM 加载 Class 文件的原理机制?答:Java 语言是一种具有动态性的解释型语言,类(Class)只有被加载到 JVM 后才气运行。当运行指定法式时,JVM 会将编译生成的 .class 文件根据需求和一定的规则加载到内存中,并组织成为一个完整的 Java 应用法式。这个加载历程是由类加载器完成,详细来说,就是由 ClassLoader 和它的子类来实现的。

类加载器自己也是一个类,其实质是把类文件从硬盘读取到内存中。类的加载方式分为隐式加载和显示加载。隐式加载指的是法式在使用 new 等方式建立工具时,会隐式地挪用类的加载器把对应的类加载到 JVM 中。显示加载指的是通过直接挪用 class.forName() 方法来把所需的类加载到 JVM 中。

任何一个工程项目都是由许多类组成的,当法式启动时,只把需要的类加载到 JVM 中,其他类只有被使用到的时候才会被加载,接纳这种方法一方面可以加速加载速度,另一方面可以节约法式运行时对内存的开销。此外,在 Java 语言中,每个类或接口都对应一个 .class 文件,这些文件可以被看成是一个个可以被动态加载的单元,因此当只有部门类被修改时,只需要重新编译变化的类即可,而不需要重新编译所有文件,因此加速了编译速度。

在 Java 语言中,类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证法式运行的基础类(例如基类)完全加载到 JVM 中,至于其他类,则在需要的时候才加载。类加载的主要步骤:装载,凭据查找路径找到相应的 class 文件,然后导入。链接,链接又可分为 3 个小步:检查,检查待加载的 class 文件的正确性。

准备,给类中的静态变量分配存储空间。剖析,将符号引用转换为直接引用(这一步可选)初始化。对静态变量和静态代码块执行初始化事情。3. Java 内存分配。

寄存器: 我们无法控制。静态域 :static界说的静态成员。常量池: 编译时被确定并生存在 .class 文件中的(final)常量值和一些文本修饰的符号引用(类和接口的全限命名,字段的名称和形貌符,方法和名称和形貌符)。

非 RAM 存储: 硬盘等永久存储空间。堆内存 :new 建立的工具和数组,由 Java 虚拟机自动垃圾接纳器治理,存取速度慢。栈内存: 基本类型的变量和工具的引用变量(堆内存空间的会见地址),速度快,可以共享,可是巨细与生存期必须确定,缺乏灵活性。4.Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?答:JVM 的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。

它在 JVM 启动的时候被建立。工具所占的堆内存是由自动内存治理系统也就是垃圾收集器接纳。堆内存是由存活和死亡的工具组成的。

存活的工具是应用可以会见的,不会被垃圾接纳。死亡的工具是应用不行会见尚且还没有被垃圾收集器接纳掉的工具。一直到垃圾收集器把这些 工具接纳掉之前,他们会一直占据堆内存空间。

5.GC 是什么? 为什么要有 GC?答:GC 是垃圾收集的意思(GabageCollection),内存处置惩罚是编程人员容易泛起问题的地方,忘记或者错误的内存接纳会导致法式或系统的不稳定甚至瓦解,Java 提供的 GC 功效可以自动监测工具是否凌驾作用域从而到达自动接纳内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。6.简述 Java 垃圾接纳机制?答:在 Java 中,法式员是不需要显示的去释放一个工具的内存的,而是由虚拟机自行执行。

在 JVM 中,有一个垃圾接纳线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的工具,并将它们添加到要接纳的荟萃中,举行接纳。7. 如何判断一个工具是否存活?(或者 GC 工具的判断方法)答:判断一个工具是否存活有两种方法:1. 引用计数法所谓引用计数法就是给每一个工具设置一个引用计数器,每当有一个地方引用这个工具时,就将计数器加一,引用失效时,计数器就减一。

当一个工具的引用计数器为零时,说明此工具没有被引用,也就是“死工具”,将会被垃圾接纳.引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当工具 A 引用工具 B,工具 B 又引用者工具 A,那么此时 A、B 工具的引用计数器都不为零,也就造成无法完成垃圾接纳,所以主流的虚拟机都没有接纳这种算法。2. 可达性算法(引用链法)该算法的思想是:从一个被称为 GC Roots 的工具开始向下搜索,如果一个工具到 GC Roots 没有任何引用链相连时,则说明此工具不行用。

在 Java 中可以作为 GC Roots 的工具有以下几种:虚拟机栈中引用的工具方法区类静态属性引用的工具方法区常量池引用的工具当地方法栈JNI引用的工具虽然这些算法可以判断一个工具是否能被接纳,可是当满足上述条件时,一个工具比纷歧定会被接纳。当一个工具不行达 GC Root 时,这个工具并不会立马被接纳,而是出于一个死缓的阶段,若要被真正的接纳需要履历两次标志.如果工具在可达性分析中没有与 GC Root 的引用链,那么此时就会被第一次标志而且举行一次筛选,筛选的条件是是否有须要执行 finalize() 方法。当工具没有笼罩 finalize() 方法或者已被虚拟机挪用过,那么就认为是没须要的。

如果该工具有须要执行 finalize() 方法,那么这个工具将会放在一个称为 F-Queue 的对行列中,虚拟时机触发一个 Finalize() 线程去执行,此线程是低优先级的,而且虚拟机不会答应一直等候它运行完,这是因为如果 finalize() 执行缓慢或者发生了死锁,那么就会造成 F-Queue 行列一直等候,造成了内存接纳系统的瓦解。GC 对处于 F-Queue 中的工具举行第二次被标志,这时,该工具将被移除” 即将接纳” 荟萃,等候接纳。8.垃圾接纳的优点和原理。

并思量 2 种接纳机制?答:Java 语言中一个显著的特点就是引入了垃圾接纳机制,使 C++ 法式员最头疼的内存治理的问题迎刃而解,它使得 Java 法式员在编写法式的时候不再需要思量内存治理。由于有个垃圾接纳机制,Java 中的工具不再有“作用域”的观点,只有工具的引用才有"作用域"。

垃圾接纳可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾接纳器通常是作为一个单独的低级此外线程运行,不行预知的情况下对内存堆中已经死亡的或者长时间没有使用的工具举行清楚和接纳,法式员不能实时的挪用垃圾接纳器对某个工具或所有工具举行垃圾接纳。

接纳机制有分代复制垃圾接纳和标志垃圾接纳,增量垃圾接纳。9.什么是漫衍式垃圾接纳(DGC)?它是如何事情的?答:DGC 叫做漫衍式垃圾接纳。

RMI 使用 DGC 来做自动垃圾接纳。因为 RMI 包罗了跨虚拟机的远程工具的引用,垃圾接纳是很难题的。DGC 使用引用计数算法来给远程工具提供自动内存治理。

10.在 Java 中,工具什么时候可以被垃圾接纳?答:当工具对当前使用这个工具的应用法式变得不行触及的时候,这个工具就可以被接纳了。11.简述 Java 内存分配与接纳策率以及 Minor GC 和 Major GC。工具优先在堆的 Eden 区分配大工具直接进入暮年代恒久存活的工具将直接进入暮年代当 Eden 区没有足够的空间举行分配时,虚拟时机执行一次 Minor GC。

Minor GC 通常发生在新生代的 Eden 区,在这个区的工具生存期短,往往发生 Gc 的频率较高,接纳速度比力快;Full GC/Major GC 发生在暮年代,一般情况下,触发暮年代 GC 的时候不会触发 Minor GC,可是通过设置,可以在 Full GC 之前举行一次 Minor GC 这样可以加速暮年代的接纳速度。12.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?答:吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用法式。而串行收集器对大多数的小应用(在现代处置惩罚器上需要或许 100M 左右的内存)就足够了。

13.Java 中垃圾收集的方法有哪些?可以参考之前我发过的一篇文章 JVM系列(四):浅谈常用四种垃圾接纳算法总结14.什么是类加载器,类加载器有哪些?答:实现通过类的权限命名获取该类的二进制字节省的代码块叫做类加载器。主要有一下四种类加载器:启动类加载器(Bootstrap ClassLoader)用来加载 Java 焦点类库,无法被 Java 法式直接引用。扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。

该类加载器在此目录内里查找并加载 Java 类。系统类加载器(system class loader):它凭据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。

可以通过 ClassLoader.getSystemClassLoader() 来获取它。用户自界说类加载器,通过继续 java.lang.ClassLoader 类的方式实现。15.类加载器双亲委派模型机制?可以参考之前我发过的一篇文章 JVM系列(九):Java类加载机制之双亲委派模型16.垃圾接纳器的基本原理是什么?垃圾接纳器可以马上接纳内存吗?有什么措施主动通知虚拟机举行垃圾接纳?答:对于 GC 来说,当法式员建立工具时,GC 就开始监控这个工具的地址、巨细以及使用情况。

通常,GC 接纳有向图的方式记载和治理堆(heap)中的所有工具。通过这种方式确定哪些工具是”可达的”,哪些工具是”不行达的”。当 GC 确定一些工具为“不行达”时,GC 就有责任接纳这些内存空间。可以。

法式员可以手动执行 System.gc(),通知 GC 运行,可是 Java 语言规范并不保证 GC 一定会执行。17.System.gc() 和 Runtime.gc() 会做什么事情?答:这两个方法用来提示 JVM 要举行垃圾接纳。

可是,立刻开始还是延迟举行垃圾接纳是取决于 JVM 的。18.finalize() 方法什么时候被挪用?析构函数 (finalization) 的目的是什么?答:垃圾接纳器(garbage colector)决议接纳某工具时,就会运行该工具的 finalize() 方法 可是在 Java 中很不幸,如果内存总是富足的,那么垃圾接纳可能永远不会举行,也就是说 filalize() 可能永远不被执行,显然指望它做收尾事情是靠不住的。

那么 finalize() 究竟是做什么的呢? 它最主要的用途是接纳特殊渠道申请的内存。Java 法式有垃圾接纳器,所以一般情况下内存问题不用法式员费心。但有一种 JNI(Java Native Interface)挪用 non-­Java 法式(C 或 C++), finalize() 的事情就是接纳这部门的内存。19.Java 中会存在内存泄漏吗,请简朴形貌。

此题我后面会单独写篇文章,有兴趣的朋侪可以关注下和点个喜欢,谢谢支持!20.如何判断工具是否已死可以参考之前我发过的一篇文章 JVM系列(三):JVM的判断工具是否已死分析总结!JVM与性能优化学习导图条记:(此Xmind图是平时学习时做的一些条记和重点缩略未展开)知识条记导图最后我自己收集了一些Java资料,内里就包容了一些BAT面试资料,以及一些 Java 高并发、漫衍式、微服务、高性能、源码分析、JVM等技术资料资料获取方式:关注我并私信“JVM”即可免费获取资料。


本文关键词:华体会体育,金三银,四,面试,季,—,道,精选,JVM,重点,问题

本文来源:华体会体育-www.shuyangol.com

联系方式

全国服务热线

058-30744676

手 机:11732118506

地 址:江苏省淮安市五原县蒂最大楼3622号

扫一扫,加微信

Copyright © 2005-2021 www.shuyangol.com. 华体会体育科技 版权所有 ICP备84068548号-1 XML地图 织梦模板