2023年6月20日发(作者:)

2020程序员必看这份JVM⼤⼚⾼频⾯试题与知识点整合!市⾯上各类 JVM 相关的资料虽多,但是明显存在两个极端:过于⽣涩难懂,或者流于某个技巧点⽽不系统化。同时各⼤公司也都越来越重视推动和发展 JVM 相关技术,⼀线⼤⼚技术⾯试现在 JVM 知识也是必考科⽬。在这个背景下,我全⾯梳理了系统化学习 JVM 的知识和经验,包括 JVM 的技术和内存模型,JVM 参数和内置⼯具,GC 算法,GC ⽇志、内存和线程等相关问题排查分析,以及常见的⾯试问题深度剖析等⾼级的进阶⽅法与实战,既满⾜⼤家快速系统化学习和全⾯掌握知识的需求,⼜兼顾⼤家的⾯试经验辅导, 需要的可以JVM⾯试题1. 内存模型以及分区,需要详细到每个区放什么。2. 堆⾥⾯的分区:Eden,survival (from+ to),⽼年代,各⾃的特点。3. 对象创建⽅法,对象的内存分配,对象的访问定位。4. GC 的两种判定⽅法:

5. SafePoint 是什么6. GC 的三种收集⽅法:标记清除、标记整理、复制算法的原理与特点,分别⽤在什么地⽅,如果让你优化收集⽅法,有什么思路?7. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。8. Minor GC 与 Full GC 分别在什么时候发⽣?9. ⼏种常⽤的内存调试⼯具:jmap、jstack、jconsole、jhat10. 类加载的⼏个过程:11. JVM 内存分哪⼏个区,每个区的作⽤是什么?12. 如和判断⼀个对象是否存活?(或者 GC 对象的判定⽅法)13. 简述 java 垃圾回收机制?14. java 中垃圾收集的⽅法有哪些?15. java 内存模型16. java 类加载过程?17. 简述 java 类加载机制?18. 类加载器双亲委派模型机制?19. 什么是类加载器,类加载器有哪些?20. 简述 java 内存分配与回收策率以及 Minor GC 和Major GC21.怎么获取 Java 程序使⽤的内存?堆使⽤的百分⽐? 中堆和栈有什么区别?23.描述⼀下 JVM 加载 Class ⽂件的原理机制?24. 什么是tomcat类加载机制? 堆的结构是什么样⼦的?26. 什么是GC调优?27. 简述各个版本内存区域的变化?28. Java 中会存在内存泄漏吗,简述⼀下?29. 垃圾回收的优点和原理,并考虑 2 种回收机制?基本原理是什么?30. 什么是分布式垃圾回收(DGC)?它是如何⼯作的?31. 讲讲你理解的性能评价及测试指标?32. 常⽤的性能优化⽅式有哪些?32. 说说分布式缓存和⼀致性哈希?

JVM知识点**JVM**(2) 运⾏过程:我们都知道Java源⽂件,通过编译器,能够⽣产相应的.Class⽂件,也就是字节码⽂件,⽽字节码⽂件⼜通过Java虚拟机中的解释器,编译成特定机器上的机器码。也就是如下:①Java源⽂件—->编译器—->字节码⽂件②字节码⽂件—->JVM—->机器码每⼀种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是Java为什么能够跨平台的原因了,当⼀个程序从开始运⾏,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。**2.线程**这⾥所说的线程指程序执⾏过程中的⼀个线程实体。JVM 允许⼀个应⽤并发执⾏多个线程。Hotspot JVM 中的Java 线程与原⽣操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建⼀个操作系统原⽣线程。Java 线程结束,原⽣线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可⽤的CPU 上。当原⽣线程初始化完毕,就会调⽤Java 线程的run() ⽅法。当线程结束时,会释放原⽣线程和Java 线程的所有资源。HotspotJVM 后台运⾏的系统线程主要有下⾯⼏个:虚拟机线程(VM thread):这个线程等待JVM 到达安全点操作出现。这些操作必须要在独⽴的线程⾥执⾏,因为当堆修改⽆法进⾏时,线程都需要JVM 位于安全点。这些操作的类型有:stop-the-world 垃圾回收、线程栈dump、线程暂停、线程偏向锁(biased locking)解除。周期性任务线程:这线程负责定时器事件(也就是中断),⽤来调度周期性操作的执⾏。GC 线程:这些线程⽀持JVM 中不同的垃圾回收活动。编译器线程:这些线程在运⾏时将字节码动态编译成本地平台相关的机器码。信号分发线程:这个线程接收发送到JVM 的信号并调⽤适当的JVM ⽅法处理内存区域JVM内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地⽅法区】、线程共享区域【JAVA堆、⽅法区】、直接内存。线程私有数据区域⽣命周期与线程相同,依赖⽤户线程的启动/结束⽽创建/销毁(在HotspotVM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的存/否跟随本地线程的⽣/死对应)。

线程共享区域随虚拟机的启动/关闭⽽创建/销毁。直接内存并不是JVM运⾏时数据区的⼀部分,但也会被频繁的使⽤:在JDK 1.4引⼊的NIO提供了基于Channel与Buffer的IO⽅式,它可以使⽤Native函数库直接分配堆外内存,然后使⽤DirectByteBuffer对象作为这块内存的引⽤进⾏操作(详见:Java I/O扩展),这样就避免了在Java堆和Native堆中来回复制数据,因此在⼀些场景中可以显著提⾼性能。3.程序计数器(线程私有)⼀块较⼩的内存空间,是当前线程所执⾏的字节码的⾏号指⽰器,每条线程都要有⼀个独⽴的程序计数器,这类内存也称为“线程私有”的内存。正在执⾏java⽅法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果还是Native⽅法,则为空。这个内存区域是唯⼀⼀个在虚拟机中没有规定任何OutOfMemoryError情况的区域。4虚拟机栈(线程私有)是描述java⽅法执⾏的内存模型,每个法在执⾏的同时都会创建⼀个栈帧(Stack Frame)⽤于存储局部变量表、操作数栈、动态链接、⽅法出⼝等信息。每⼀个⽅法从调⽤直⾄执⾏完成的过程,就对应着⼀个栈帧在虚拟机栈中⼊栈到出栈的过程。栈帧(Frame)是⽤来存储数据和部分过程结果的数据结构,同时也被⽤来处理动态链接(Dynamic Linking)、⽅法返回值和异常分派(DispatchException)。栈帧随着⽅法调⽤⽽创建,随着⽅法结束⽽销毁——⽆论⽅法是正常完成还是异常完成(抛出了在⽅法内未被捕获的异常)都算作⽅法结束。5.本地⽅法区(线程私有)本地⽅法区和Java Stack作⽤类似,区别是虚拟机栈为执⾏Java⽅法服务,⽽本地⽅法栈则为Native⽅法服务,如果⼀个VM实现使⽤C-linkage模型来⽀持Native调⽤,那么该栈将会是⼀个C栈,但HotSpot VM直接就把本地⽅法栈和虚拟机栈合⼆为⼀。6.堆(Heap-线程共享)-运⾏时数据区是被线程共享的⼀块内存区域,创建的对象和数组都保存在Java堆内存中,也是垃圾收集器进⾏垃圾收集的最重要的内存区域。由于现代VM采⽤分代收集算法,因此Java堆从GC的⾓度还可以细分为:新⽣代(Eden 区、From Survivor 区和To Survivor 区)和⽼年代。

7.⽅法区l永久代(线程共享)即我们常说的永久代(Permanent Generation),⽤于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. HotSpot VM把GC分代收集扩展⾄⽅法区,即使⽤Java堆的永久代来实现⽅法区,这样HotSpot的垃圾收集器就可以像管理Java堆⼀样管理这部分内存,⽽不必为⽅法区开发专门的内存管理器(永久带的内存回收的主要⽬标是针对常量池的回收和类型的卸载,因此收益⼀般很⼩)。运⾏时常量池(Runtime Constant Pool)是⽅法区的⼀部分。Class⽂件中除了有类的版本、字段、⽅法、接⼝等描述等信息外,还有⼀项信息是常量池(Constant Pool Table),⽤于存放编译期⽣成的各种字⾯量和符号引⽤,这部分内容将在类加载后存放到⽅法区的运⾏时常量池中。Java 虚拟机对Class⽂件的每⼀部分(⾃然也包括常量池)的格式都有严格的规定,每⼀个字节⽤于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执⾏。

运⾏时内存Java堆从GC的⾓度还可以细分为:新⽣代(Eden区、From Survivor区和To Survivor区)和⽼年代。2.3.1.新⽣代是⽤来存放新⽣的对象。⼀般占据堆的1/3空间。由于频繁创建对象,所以新⽣代会频繁触发MinorGC进⾏垃圾回收。新⽣代⼜分为Eden区、ServivorFrom、ServivorTo三个区。区Java新对象的出⽣地(如果新创建的对象占⽤内存很⼤,则直接分配到⽼年代)。当Eden区内存不够的时候就会触发MinorGC,对新⽣代区进⾏⼀次垃圾回收。orFrom上⼀次GC的幸存者,作为这⼀次GC的被扫描者。orTo保留了⼀次MinorGC过程中的幸存者。C的过程(复制->清空->互换)MinorGC采⽤复制算法。1: eden、servicorFrom复制到ServicorTo,年龄+1⾸先,把Eden和ServivorFrom区域中存活的对象复制到ServicorTo区域(如果有对象的年龄以及达到了⽼年的标准,则赋值到⽼年代区),同时把这些对象的年龄+1(如果ServicorTo不够位置了就放到⽼年区);2:清空eden、servicorFrom然后,清空Eden和ServicorFrom 中的对象;3: ServicorTo和 ServicorFrom互换最后,ServicorTo和ServicorFrom互换,原ServicorTo成为下⼀次GC时的ServicorFrom区。9.⽼年代主要存放应⽤程序中⽣命周期长的内存对象。⽼年代的对象⽐较稳定,所以MajorGC 不会频繁执⾏。在进⾏MajorGC前⼀般都先进⾏了⼀次 MinorGC,使得有新⽣代的对象晋⾝⼊⽼年代,导致空间不够⽤时才触发。当⽆法找到⾜够⼤的连续空间分配给新创建的较⼤对象时也会提前触发⼀次MajorGC进⾏垃圾回收腾出空间。MajorGC采⽤标记清除算法:⾸先扫描⼀次所有⽼年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时⽐较长,因为要扫描再回收。MajorGC 会产⽣内存碎⽚,为了减少内存损耗,我们⼀般需要进⾏合并或者标记出来⽅便下次直接分配。当⽼年代也满了装不下的时候,就会抛出OOM (Out of Memory)异常。

10.永久代指内存的永久保存区域,主要存放Class 和Meta(元数据)的信息,Class在被加载的时候被放⼊永久区域,它和和存放实例的区域不同,GC不会在主程序运⾏期对永久区域进⾏清理。所以这也导致了永久代的区域会随着加载的Class的增多⽽胀满,最终抛出OOM异常。11.垃圾回收与算法12.如何确定垃圾1.引⽤计数法在Java 中,引⽤和对象是有关联的。如果要操作对象则必须⽤引⽤进⾏。因此,很显然⼀个简单的办法是通过引⽤计数来判断⼀个对象是否可以回收。简单说,即⼀个对象如果没有任何与之关联的引⽤,即他们的引⽤计数都不为О,则说明对象不太可能再被⽤到,那么这个对象就是可回收对象。2.可达性分析为了解决引⽤计数法的循环引⽤问题,Java 使⽤了可达性分析的⽅法。通过⼀系列的“GC roots"对象作为起点搜索。如果在“GC roots”和⼀个对象之间没有可达路径,则称该对象是不可达的。要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象⾄少要经过两次标记过程。两次标记后仍然是可回收对象,则将⾯临回收。13.标记清除算法(Mark-Sweep)最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占⽤的空间。如图从图中我们就可以发现,该算法最⼤的问题是内存碎⽚化严重,后续可能发⽣⼤对象不能找到可利⽤空间的问题。总结所有的⾯试题⽬都不是⼀成不变的,特别是像⼀线⼤⼚,上⾯的⾯试真题只是给⼤家⼀个借鉴作⽤,最主要的是给⾃⼰增加知识的储备,有备⽆患。给⼤家分享整理的2019年⼤⼚JVM⾯试题资料(20多页pdf⽂档)以及多家公司java⾯试题资料100多页pdf⽂档和各知识点学习路线思维脑图(xmind)还有JVM讲解视频。需要的可以

2023年6月20日发(作者:)

2020程序员必看这份JVM⼤⼚⾼频⾯试题与知识点整合!市⾯上各类 JVM 相关的资料虽多,但是明显存在两个极端:过于⽣涩难懂,或者流于某个技巧点⽽不系统化。同时各⼤公司也都越来越重视推动和发展 JVM 相关技术,⼀线⼤⼚技术⾯试现在 JVM 知识也是必考科⽬。在这个背景下,我全⾯梳理了系统化学习 JVM 的知识和经验,包括 JVM 的技术和内存模型,JVM 参数和内置⼯具,GC 算法,GC ⽇志、内存和线程等相关问题排查分析,以及常见的⾯试问题深度剖析等⾼级的进阶⽅法与实战,既满⾜⼤家快速系统化学习和全⾯掌握知识的需求,⼜兼顾⼤家的⾯试经验辅导, 需要的可以JVM⾯试题1. 内存模型以及分区,需要详细到每个区放什么。2. 堆⾥⾯的分区:Eden,survival (from+ to),⽼年代,各⾃的特点。3. 对象创建⽅法,对象的内存分配,对象的访问定位。4. GC 的两种判定⽅法:

5. SafePoint 是什么6. GC 的三种收集⽅法:标记清除、标记整理、复制算法的原理与特点,分别⽤在什么地⽅,如果让你优化收集⽅法,有什么思路?7. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。8. Minor GC 与 Full GC 分别在什么时候发⽣?9. ⼏种常⽤的内存调试⼯具:jmap、jstack、jconsole、jhat10. 类加载的⼏个过程:11. JVM 内存分哪⼏个区,每个区的作⽤是什么?12. 如和判断⼀个对象是否存活?(或者 GC 对象的判定⽅法)13. 简述 java 垃圾回收机制?14. java 中垃圾收集的⽅法有哪些?15. java 内存模型16. java 类加载过程?17. 简述 java 类加载机制?18. 类加载器双亲委派模型机制?19. 什么是类加载器,类加载器有哪些?20. 简述 java 内存分配与回收策率以及 Minor GC 和Major GC21.怎么获取 Java 程序使⽤的内存?堆使⽤的百分⽐? 中堆和栈有什么区别?23.描述⼀下 JVM 加载 Class ⽂件的原理机制?24. 什么是tomcat类加载机制? 堆的结构是什么样⼦的?26. 什么是GC调优?27. 简述各个版本内存区域的变化?28. Java 中会存在内存泄漏吗,简述⼀下?29. 垃圾回收的优点和原理,并考虑 2 种回收机制?基本原理是什么?30. 什么是分布式垃圾回收(DGC)?它是如何⼯作的?31. 讲讲你理解的性能评价及测试指标?32. 常⽤的性能优化⽅式有哪些?32. 说说分布式缓存和⼀致性哈希?

JVM知识点**JVM**(2) 运⾏过程:我们都知道Java源⽂件,通过编译器,能够⽣产相应的.Class⽂件,也就是字节码⽂件,⽽字节码⽂件⼜通过Java虚拟机中的解释器,编译成特定机器上的机器码。也就是如下:①Java源⽂件—->编译器—->字节码⽂件②字节码⽂件—->JVM—->机器码每⼀种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是Java为什么能够跨平台的原因了,当⼀个程序从开始运⾏,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。**2.线程**这⾥所说的线程指程序执⾏过程中的⼀个线程实体。JVM 允许⼀个应⽤并发执⾏多个线程。Hotspot JVM 中的Java 线程与原⽣操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建⼀个操作系统原⽣线程。Java 线程结束,原⽣线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可⽤的CPU 上。当原⽣线程初始化完毕,就会调⽤Java 线程的run() ⽅法。当线程结束时,会释放原⽣线程和Java 线程的所有资源。HotspotJVM 后台运⾏的系统线程主要有下⾯⼏个:虚拟机线程(VM thread):这个线程等待JVM 到达安全点操作出现。这些操作必须要在独⽴的线程⾥执⾏,因为当堆修改⽆法进⾏时,线程都需要JVM 位于安全点。这些操作的类型有:stop-the-world 垃圾回收、线程栈dump、线程暂停、线程偏向锁(biased locking)解除。周期性任务线程:这线程负责定时器事件(也就是中断),⽤来调度周期性操作的执⾏。GC 线程:这些线程⽀持JVM 中不同的垃圾回收活动。编译器线程:这些线程在运⾏时将字节码动态编译成本地平台相关的机器码。信号分发线程:这个线程接收发送到JVM 的信号并调⽤适当的JVM ⽅法处理内存区域JVM内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地⽅法区】、线程共享区域【JAVA堆、⽅法区】、直接内存。线程私有数据区域⽣命周期与线程相同,依赖⽤户线程的启动/结束⽽创建/销毁(在HotspotVM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的存/否跟随本地线程的⽣/死对应)。

线程共享区域随虚拟机的启动/关闭⽽创建/销毁。直接内存并不是JVM运⾏时数据区的⼀部分,但也会被频繁的使⽤:在JDK 1.4引⼊的NIO提供了基于Channel与Buffer的IO⽅式,它可以使⽤Native函数库直接分配堆外内存,然后使⽤DirectByteBuffer对象作为这块内存的引⽤进⾏操作(详见:Java I/O扩展),这样就避免了在Java堆和Native堆中来回复制数据,因此在⼀些场景中可以显著提⾼性能。3.程序计数器(线程私有)⼀块较⼩的内存空间,是当前线程所执⾏的字节码的⾏号指⽰器,每条线程都要有⼀个独⽴的程序计数器,这类内存也称为“线程私有”的内存。正在执⾏java⽅法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果还是Native⽅法,则为空。这个内存区域是唯⼀⼀个在虚拟机中没有规定任何OutOfMemoryError情况的区域。4虚拟机栈(线程私有)是描述java⽅法执⾏的内存模型,每个法在执⾏的同时都会创建⼀个栈帧(Stack Frame)⽤于存储局部变量表、操作数栈、动态链接、⽅法出⼝等信息。每⼀个⽅法从调⽤直⾄执⾏完成的过程,就对应着⼀个栈帧在虚拟机栈中⼊栈到出栈的过程。栈帧(Frame)是⽤来存储数据和部分过程结果的数据结构,同时也被⽤来处理动态链接(Dynamic Linking)、⽅法返回值和异常分派(DispatchException)。栈帧随着⽅法调⽤⽽创建,随着⽅法结束⽽销毁——⽆论⽅法是正常完成还是异常完成(抛出了在⽅法内未被捕获的异常)都算作⽅法结束。5.本地⽅法区(线程私有)本地⽅法区和Java Stack作⽤类似,区别是虚拟机栈为执⾏Java⽅法服务,⽽本地⽅法栈则为Native⽅法服务,如果⼀个VM实现使⽤C-linkage模型来⽀持Native调⽤,那么该栈将会是⼀个C栈,但HotSpot VM直接就把本地⽅法栈和虚拟机栈合⼆为⼀。6.堆(Heap-线程共享)-运⾏时数据区是被线程共享的⼀块内存区域,创建的对象和数组都保存在Java堆内存中,也是垃圾收集器进⾏垃圾收集的最重要的内存区域。由于现代VM采⽤分代收集算法,因此Java堆从GC的⾓度还可以细分为:新⽣代(Eden 区、From Survivor 区和To Survivor 区)和⽼年代。

7.⽅法区l永久代(线程共享)即我们常说的永久代(Permanent Generation),⽤于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. HotSpot VM把GC分代收集扩展⾄⽅法区,即使⽤Java堆的永久代来实现⽅法区,这样HotSpot的垃圾收集器就可以像管理Java堆⼀样管理这部分内存,⽽不必为⽅法区开发专门的内存管理器(永久带的内存回收的主要⽬标是针对常量池的回收和类型的卸载,因此收益⼀般很⼩)。运⾏时常量池(Runtime Constant Pool)是⽅法区的⼀部分。Class⽂件中除了有类的版本、字段、⽅法、接⼝等描述等信息外,还有⼀项信息是常量池(Constant Pool Table),⽤于存放编译期⽣成的各种字⾯量和符号引⽤,这部分内容将在类加载后存放到⽅法区的运⾏时常量池中。Java 虚拟机对Class⽂件的每⼀部分(⾃然也包括常量池)的格式都有严格的规定,每⼀个字节⽤于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执⾏。

运⾏时内存Java堆从GC的⾓度还可以细分为:新⽣代(Eden区、From Survivor区和To Survivor区)和⽼年代。2.3.1.新⽣代是⽤来存放新⽣的对象。⼀般占据堆的1/3空间。由于频繁创建对象,所以新⽣代会频繁触发MinorGC进⾏垃圾回收。新⽣代⼜分为Eden区、ServivorFrom、ServivorTo三个区。区Java新对象的出⽣地(如果新创建的对象占⽤内存很⼤,则直接分配到⽼年代)。当Eden区内存不够的时候就会触发MinorGC,对新⽣代区进⾏⼀次垃圾回收。orFrom上⼀次GC的幸存者,作为这⼀次GC的被扫描者。orTo保留了⼀次MinorGC过程中的幸存者。C的过程(复制->清空->互换)MinorGC采⽤复制算法。1: eden、servicorFrom复制到ServicorTo,年龄+1⾸先,把Eden和ServivorFrom区域中存活的对象复制到ServicorTo区域(如果有对象的年龄以及达到了⽼年的标准,则赋值到⽼年代区),同时把这些对象的年龄+1(如果ServicorTo不够位置了就放到⽼年区);2:清空eden、servicorFrom然后,清空Eden和ServicorFrom 中的对象;3: ServicorTo和 ServicorFrom互换最后,ServicorTo和ServicorFrom互换,原ServicorTo成为下⼀次GC时的ServicorFrom区。9.⽼年代主要存放应⽤程序中⽣命周期长的内存对象。⽼年代的对象⽐较稳定,所以MajorGC 不会频繁执⾏。在进⾏MajorGC前⼀般都先进⾏了⼀次 MinorGC,使得有新⽣代的对象晋⾝⼊⽼年代,导致空间不够⽤时才触发。当⽆法找到⾜够⼤的连续空间分配给新创建的较⼤对象时也会提前触发⼀次MajorGC进⾏垃圾回收腾出空间。MajorGC采⽤标记清除算法:⾸先扫描⼀次所有⽼年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时⽐较长,因为要扫描再回收。MajorGC 会产⽣内存碎⽚,为了减少内存损耗,我们⼀般需要进⾏合并或者标记出来⽅便下次直接分配。当⽼年代也满了装不下的时候,就会抛出OOM (Out of Memory)异常。

10.永久代指内存的永久保存区域,主要存放Class 和Meta(元数据)的信息,Class在被加载的时候被放⼊永久区域,它和和存放实例的区域不同,GC不会在主程序运⾏期对永久区域进⾏清理。所以这也导致了永久代的区域会随着加载的Class的增多⽽胀满,最终抛出OOM异常。11.垃圾回收与算法12.如何确定垃圾1.引⽤计数法在Java 中,引⽤和对象是有关联的。如果要操作对象则必须⽤引⽤进⾏。因此,很显然⼀个简单的办法是通过引⽤计数来判断⼀个对象是否可以回收。简单说,即⼀个对象如果没有任何与之关联的引⽤,即他们的引⽤计数都不为О,则说明对象不太可能再被⽤到,那么这个对象就是可回收对象。2.可达性分析为了解决引⽤计数法的循环引⽤问题,Java 使⽤了可达性分析的⽅法。通过⼀系列的“GC roots"对象作为起点搜索。如果在“GC roots”和⼀个对象之间没有可达路径,则称该对象是不可达的。要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象⾄少要经过两次标记过程。两次标记后仍然是可回收对象,则将⾯临回收。13.标记清除算法(Mark-Sweep)最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占⽤的空间。如图从图中我们就可以发现,该算法最⼤的问题是内存碎⽚化严重,后续可能发⽣⼤对象不能找到可利⽤空间的问题。总结所有的⾯试题⽬都不是⼀成不变的,特别是像⼀线⼤⼚,上⾯的⾯试真题只是给⼤家⼀个借鉴作⽤,最主要的是给⾃⼰增加知识的储备,有备⽆患。给⼤家分享整理的2019年⼤⼚JVM⾯试题资料(20多页pdf⽂档)以及多家公司java⾯试题资料100多页pdf⽂档和各知识点学习路线思维脑图(xmind)还有JVM讲解视频。需要的可以