搞定这些jvm面试题,让你offer拿到手软!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搞定这些jvm面试题,让你offer拿到手软!相关的知识,希望对你有一定的参考价值。

JVM 面试题

一.Java 类加载过程?

Java 类加载需要经历一下 7 个过程:

1.加载

加载是类加载的第一个过程,在这个阶段,将完成一下三件事情:

?通过一个类的全限定名获取该类的二进制流。
?将该二进制流中的静态存储结构转化为方法去运行时数据结构。
?在内存中生成该类的 Class 对象,作为该类的数据访问入口。

2.验证

验证的目的是为了确保 Class 文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证:
?文件格式验证:验证字节流是否符合 Class 文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.
?元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。

?字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。
?符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。
3.准备

准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。

public static int value=123;//在准备阶段 value 初始值为 0 。在初始化阶段才会变为 123 。
4.解析

该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。
5.初始化

初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由

虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的
Java 程序代码。

6.使用

7.卸载
二.描述一下 JVM 加载 Class 文件的原理机制?
Java 语言是一种具有动态性的解释型语言,类(Class)只有被加载到 JVM 后才能运行。当运行指定程序时,JVM 会将编译生成的 .class 文件按照需求和一定的规则加载到内存中,并组织成为一个完整的 Java 应用程序。这个加载过程是由类加载器完成,具体来说,就是由 ClassLoader 和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。
类的加载方式分为隐式加载和显示加载。隐式加载指的是程序在使用 new 等方式创建对象时,会隐式地调用类的加载器把对应的类加载到 JVM 中。显示加载指的是通过直接调用 class.forName() 方法来把所需的类加载到 JVM 中。
任何一个工程项目都是由许多类组成的,当程序启动时,只把需要的类加载到 JVM 中,其他类只有被使用到的时候才会被加载,采用这种方法一方面可以加快加载速度,另一方面可以节约程序运行时对内存的开销。此外,在 Java 语言中,每个类或接口都对应一个 .class 文件,这些文件可以被看成是一个个可以被动态加载的

单元,因此当只有部分类被修改时,只需要重新编译变化的类即可, 而不需要重新编译所有文件,因此加快了编译速度。
在 Java 语言中,类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(例如基类)完全加载到 JVM 中,至于其他类,则在需要的时候才加载。
类加载的主要步骤:

?装载。根据查找路径找到相应的 class 文件,然后导入。
?链接。链接又可分为 3 个小步:
?检查,检查待加载的 class 文件的正确性。
?准备,给类中的静态变量分配存储空间。
?解析,将符号引用转换为直接引用(这一步可选)
?初始化。对静态变量和静态代码块执行初始化工作。
三 Java 内存分配。

?寄存器:我们无法控制。
?静态域:static 定义的静态成员。
?常量池:编译时被确定并保存在 .class 文件中的(final)常量值和一些文本修饰的符号引用(类和接口的全限定名,字段的名称和描述符,方法和名称和描述符)。
?非 RAM 存储:硬盘等永久存储空间。

?堆内存:new 创建的对象和数组,由 Java 虚拟机自动垃圾回收器管理,存取速度慢。
?栈内存:基本类型的变量和对象的引用变量(堆内存空间的访问地址),速度快,可以共享,但是大小与生存期必须确定,缺乏灵活性。

  1. Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
    JVM 的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在 JVM 启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
    堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些 对象回收掉之前,他们会一直占据堆内存空间。
    四.GC 是什么? 为什么要有 GC?

GC 是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。

未完待续···········

以上是关于搞定这些jvm面试题,让你offer拿到手软!的主要内容,如果未能解决你的问题,请参考以下文章

2021阿里Java高级面试题总结,offer拿到手软

2020毕业不要慌,给想当程序员的你——面试宝典,让你offer拿到手软!

Java集合中常见的面试题 (收藏+保存+offer拿到手软)

Java集合中常见的面试题 (收藏+保存+offer拿到手软)

挑战阿里社招百万年薪,吃透这37个经典面试题,offer能拿到手软

Android高级工程师每日面试题精选,offer拿到手软