JVM 是小白 Java 程序员成长路上的一道坎也是不少工做2到3年程序员的一个重点面试问题之一,学习JVM以前,只须要知道代码编译成 Class,虚拟机加载 Class 运行就能够了,学习 JVM 以后,能够深刻理解代码从编译到加载的过程、内存中对象的建立与垃圾回收、平常开发中快速定位性能问题等,固然也是面试不可缺乏的加分项。在这我整理20道精选的JVM面试题分享给你们,但愿能帮助到你们同时能够点个赞关注下,多谢支持!java
答:Java 类加载须要经历一下 7 个过程:程序员
1. 加载面试
加载是类加载的第一个过程,在这个阶段,将完成一下三件事情:算法
2. 验证编程
验证的目的是为了确保 Class 文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成如下四钟验证:数组
3. 准备性能优化
准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一块儿分配在 Java 堆中。数据结构
public static int value=123;//在准备阶段value初始值为0 。在初始化阶段才会变为123 复制代码
4. 解析分布式
该阶段主要完成符号引用到直接引用的转换动做。解析动做并不必定在初始化动做完成以前,也有可能在初始化以后。函数
5. 初始化
初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序能够经过自定义类加载器参与以外,其他动做彻底由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的 Java 程序代码。
6. 使用
7. 卸载
答:Java 语言是一种具备动态性的解释型语言,类(Class)只有被加载到 JVM 后才能运行。当运行指定程序时,JVM 会将编译生成的 .class 文件按照需求和必定的规则加载到内存中,并组织成为一个完整的 Java 应用程序。这个加载过程是由类加载器完成,具体来讲,就是由 ClassLoader 和它的子类来实现的。类加载器自己也是一个类,其实质是把类文件从硬盘读取到内存中。
类的加载方式分为隐式加载和显示加载。隐式加载指的是程序在使用 new 等方式建立对象时,会隐式地调用类的加载器把对应的类加载到 JVM 中。显示加载指的是经过直接调用 class.forName() 方法来把所需的类加载到 JVM 中。
任何一个工程项目都是由许多类组成的,当程序启动时,只把须要的类加载到 JVM 中,其余类只有被使用到的时候才会被加载,采用这种方法一方面能够加快加载速度,另外一方面能够节约程序运行时对内存的开销。此外,在 Java 语言中,每一个类或接口都对应一个 .class 文件,这些文件能够被当作是一个个能够被动态加载的单元,所以当只有部分类被修改时,只须要从新编译变化的类便可,而不须要从新编译全部文件,所以加快了编译速度。
在 Java 语言中,类的加载是动态的,它并不会一次性将全部类所有加载后再运行,而是保证程序运行的基础类(例如基类)彻底加载到 JVM 中,至于其余类,则在须要的时候才加载。
类加载的主要步骤:
答:JVM 的堆是运行时数据区,全部类的实例和数组都是在堆上分配内存。它在 JVM 启动的时候被建立。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用能够访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且尚未被垃圾收集器回收掉的对象。一直到垃圾收集器把这些 对象回收掉以前,他们会一直占据堆内存空间。
答:GC 是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会致使程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能能够自动监测对象是否超过做用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操做方法。
答:在 Java 中,程序员是不须要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM 中,有一个垃圾回收线程,它是低优先级的,在正常状况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。
答:判断一个对象是否存活有两种方法:
1. 引用计数法
所谓引用计数法就是给每个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收.
引用计数法有一个缺陷就是没法解决循环引用问题,也就是说当对象 A 引用对象 B,对象 B 又引用者对象 A,那么此时 A、B 对象的引用计数器都不为零,也就形成没法完成垃圾回收,因此主流的虚拟机都没有采用这种算法。
2. 可达性算法(引用链法)
该算法的思想是:从一个被称为 GC Roots 的对象开始向下搜索,若是一个对象到 GC Roots 没有任何引用链相连时,则说明此对象不可用。
在 Java 中能够做为 GC Roots 的对象有如下几种:
虽然这些算法能够断定一个对象是否能被回收,可是当知足上述条件时,一个对象比不必定会被回收。当一个对象不可达 GC Root 时,这个对象并不会立马被回收,而是出于一个死缓的阶段,若要被真正的回收须要经历两次标记.
若是对象在可达性分析中没有与 GC Root 的引用链,那么此时就会被第一次标记而且进行一次筛选,筛选的条件是是否有必要执行 finalize() 方法。当对象没有覆盖 finalize() 方法或者已被虚拟机调用过,那么就认为是不必的。 若是该对象有必要执行 finalize() 方法,那么这个对象将会放在一个称为 F-Queue 的对队列中,虚拟机会触发一个 Finalize() 线程去执行,此线程是低优先级的,而且虚拟机不会承诺一直等待它运行完,这是由于若是 finalize() 执行缓慢或者发生了死锁,那么就会形成 F-Queue 队列一直等待,形成了内存回收系统的崩溃。GC 对处于 F-Queue 中的对象进行第二次被标记,这时,该对象将被移除” 即将回收” 集合,等待回收。
答:Java 语言中一个显著的特色就是引入了垃圾回收机制,使 C++ 程序员最头疼的内存管理的问题迎刃而解,它使得 Java 程序员在编写程序的时候再也不须要考虑内存管理。因为有个垃圾回收机制,Java 中的对象再也不有“做用域”的概念,只有对象的引用才有"做用域"。垃圾回收能够有效的防止内存泄露,有效的使用可使用的内存。垃圾回收器一般是做为一个单独的低级别的线程运行,不可预知的状况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或全部对象进行垃圾回收。
回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
答:DGC 叫作分布式垃圾回收。RMI 使用 DGC 来作自动垃圾回收。由于 RMI 包含了跨虚拟机的远程对象的引用,垃圾回收是很困难的。DGC 使用引用计数算法来给远程对象提供自动内存管理。
答:当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就能够被回收了。
当 Eden 区没有足够的空间进行分配时,虚拟机会执行一次 Minor GC。Minor GC 一般发生在新生代的 Eden 区,在这个区的对象生存期短,每每发生 Gc 的频率较高,回收速度比较快;Full GC/Major GC 发生在老年代,通常状况下,触发老年代 GC 的时候不会触发 Minor GC,可是经过配置,能够在 Full GC 以前进行一次 Minor GC 这样能够加快老年代的回收速度。
答:吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。 而串行收集器对大多数的小应用(在现代处理器上须要大概 100M 左右的内存)就足够了。
能够参考以前的一篇文章:JVM的判断对象是否已死和四种垃圾回收算法
答:实现经过类的权限定名获取该类的二进制字节流的代码块叫作类加载器。
主要有一下四种类加载器:
能够参考以前我发过的一篇文章JVM面试问题系列:Java类加载机制之双亲委派模型
答:对于 GC 来讲,当程序员建立对象时,GC 就开始监控这个对象的地址、大小以及使用状况。一般,GC 采用有向图的方式记录和管理堆(heap)中的全部对象。经过这种方式肯定哪些对象是”可达的”,哪些对象是”不可达的”。当 GC 肯定一些对象为“不可达”时,GC 就有责任回收这些内存空间。能够。程序员能够手动执行 System.gc(),通知 GC 运行,可是 Java 语言规范并不保证 GC 必定会执行。
答:这两个方法用来提示 JVM 要进行垃圾回收。可是,当即开始仍是延迟进行垃圾回收是取决于 JVM 的。
答:垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的 finalize() 方法 可是在 Java 中很不幸,若是内存老是充足的,那么垃圾回收可能永远不会进行,也就是说 filalize() 可能永远不被执行,显然期望它作收尾工做是靠不住的。 那么 finalize() 到底是作什么的呢? 它最主要的用途是回收特殊渠道申请的内存。Java 程序有垃圾回收器,因此通常状况下内存问题不用程序员操心。但有一种 JNI(Java Native Interface)调用 non-Java 程序(C 或 C++), finalize() 的工做就是回收这部分的内存。
此题我后面会单独写篇文章,有兴趣的朋友能够关注下和点个喜欢,谢谢支持!
能够参考以前的一篇文章:JVM的判断对象是否已死和四种垃圾回收算法
(此Xmind图是平时学习时作的一些笔记和重点缩略未展开)