当前位置: 首页 > 图灵资讯 > 技术篇> 关于JVM面试题(附答案)

关于JVM面试题(附答案)

来源:图灵教育
时间:2023-04-10 17:23:58

相信对Java关注的朋友一定知道Java语言在互联网行业有多热。不仅传统互联网企业会使用Java语言,很多传统企业也在转型,需要更多Java程序员,尤其是对高级Java工程师和Java架构师有很多需求。我之前为大家整理了很多Java面试中经常考到的Java其他知识点面试题,今天也给大家带来了学习内容,关于JVM面试题附答案,下面整理了几个问题,是可能的Java面试中考察到的,可以学习。

1、Java内存管理机制是什么?以及Java调优工具的垃圾回收原理和使用?

答:内存管理的职责是分配和回收内存。 没有自动内存管理的语言/平台容易出错。典型的问题包括悬挂指针。一个指针引用了一个回收的内存地址,导致程序的运行完全未知。另一个典型的问题是内存泄漏。内存已经分配,但没有指向内存的指针,导致内存泄漏。 在调试这类问题上,程序员需要花费大量的时间。

2、JVM加载class文件的原理机制?

答:JVM中类的装载是由类加载器组成的(ClassLoader)Java中的类加载器是Java运行过程中的一个重要系统组件,它负责在运行过程中搜索和安装类文件中的类。

由于Java的跨平台编译Java源程序不是可执行程序,而是一个或多个类别的文件。当Java程序需要使用某一类时,JVM将确保该类已被加载、连接(验证、准备和分析)和初始化。类别加载是指类别.class文件中的数据读入内存,通常创建字节数组读入.class文件,然后生成与加载类对应的class对象。加载完成后,Class对象不完整,此时类别不可用。当类被加载后进入连接阶段,包括三个步骤:验证、准备(为静态变量分配内存并设置默认初始值)和分析(用直接引用替换符号)。最后,JVM对类是初始化的,包括:如果有直接的父类,而且这类还没有初始化,那就先初始化父类;如果类中有初始语句,这些初始语句将依次执行。

3、解释几种类型的加载器?

答:类加载由类加载器完成,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)与用户自定义类加载器(java.lang.Classloader的子类)。从Java 2(JDK 1.2)类加载过程从父亲的委托机制开始(PDM)。PDM更好地保证了Java平台的安全。在这种机制下,JVM自己的Bootstrap是一个根加载器,其他加载器只有一个父加载器。类加载首先要求父类加载器加载,父类加载器无能为力时,其子类加载器自行加载。JVM不会向Java程序提供Bootstrap的引用。

1)Bootstrap:JVM基础核心类库一般采用本地代码加载(rt.jar);

2)Extension:从java.ext.在dirs系统属性指定的目录中加载类库,其父加载器是bootstrap;

3)System:它也被称为应用加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或系统属性java.class.在path指定的目录中,记录类是用户自定义加载器的默认父加载器。

4、JVM的原理是什么?内存泄漏和溢出有什么区别?什么时候会发生内存泄漏?

:JVM原理:JVM是Java Virtual Machine(Java虚拟机)的缩写是整个Java跨平台的核心部分,所有Java程序都将首先编译成.可以在虚拟机上执行class类文件,即class不直接对应机器的操作系统,而是通过虚拟机间接与操作系统交互,程序由虚拟机向本地系统解释。JVM是Java平台的基础。和实际机器一样,它也有自己的指令集,在运行过程中操作不同的内存区域。JVM是Java平台的基础。与实际机器一样,它也有自己的指令集,并在运行过程中操作不同的内存区域。JVM提供了一种与平台无关的代码执行方法,即与特殊实现方法、主机硬件和主机操作系统无关的代码执行方法。JVM的主要工作是向CPU的指令集或相应的系统解释其指令集(即字节码),以保护用户免受恶意程序的干扰。JVM不关心上层Java源文件,只关注源文件生成的类文件(.class文件)。

5、内存泄漏和溢出有什么区别?

答:(1)内存泄漏是指分配的内存无法回收;(2)内存溢出是指程序要求的内存,超过系统可分配的范围导致溢出。例如,用byte类型的变量存储1万个数据属于内存溢出;(3)内存溢出是提供的内存不足;内存泄漏不能再提供内存资源。

6、内存泄漏什么时候发生?

答:(1)静态集合类:使用set、Vector、Hashmap等集合类需要特别注意,可能会发生内存泄漏。当这些集合被定义为静态时,内存泄漏可能会发生,因为它们的生命周期和应用程序一样长。

2)监听器:在Java中,我们经常使用监听器,比如在某个控件中添加单击监听器addonclicklistener(),但在释放对象时往往会忘记删除监听器,这可能会导致内存泄漏。一个好的方法是记住释放所有的监听器,以避免监听器造成的内存泄漏。

3)各种连接:Java中的连接包括数据库连接、网络连接和IO连接。如果没有显式调用其Close()方法,则不会自动关闭,这些连接不会被GC回收,导致内存泄漏。一般来说,在try代码块中创建连接并在finaly中释放连接可以避免此类内存泄漏。

4)引用外部模块:调用外部模块时,还应注意防止内存泄漏。例如,模块A调用了外部模块B的方法,例如:public void register(Object o)。这种方法可能会导致A模块持有引用对象。此时,有必要检查B模块是否提供了去除引用的方法,如unregister()。这种情况很容易被忽视,如果发生内存泄漏,很难检测到。在编写代码的过程中应注意这些问题。

5)单例模式:使用单例模式也可能导致内存泄漏。由于单个对象初始化后将存在于JVM的整个生命周期中,如果它持有外部对象(生命周期相对较短),则外部对象不能回收,导致内存泄漏。如果外部对象仍然持有其他对象的引用,则内存泄漏将更加严重,因此需要特别注意这种情况。在这种情况下,有必要考虑下单例模式的设计是否存在问题,以及如何确保不会出现内存泄漏问题。

上面的六个问题是今天带领你学习的JVM面试问题的知识点。我希望读完这篇文章后,你能彻底理解这六个问题。更重要的是,它还涉及Java中的其他内容,可以通过Java培训课程系统学习,全面掌握Java相关知识点。