JVM面试专题及答案

合集下载

24个Jvm面试题总结及答案

24个Jvm面试题总结及答案

24个Jvm面试题总结及答案1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。

Java源文件被编译成能被Java虚拟机执行的字节码文件。

Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。

Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2.Java内存结构?方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。

•Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。

此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

•方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

•程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

•JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。

虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。

每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

•本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

JVM内存管理面试题及深度解析

JVM内存管理面试题及深度解析

JVM内存管理面试题及深度解析
问题:JVM内存管理面试题及深度解析回答:
题目:给出一段虚拟机栈和本地方法栈溢出的代码:分StackOverflowError和OutOfMemoryError给出程序
JVM内存概要:
答案解析:
堆溢出:堆里放的是new出来的对象,所以这部分很简单不断的new对象就可以了,但是为了防止对象new出来之后被GC,所以把对象new出来的对象放到一个List中去即可。

为了有更好的效果,可以在运行前,调整堆的参数。

针对HotSpot虚拟机中的栈溢出,如果请求的栈深度大于虚拟机所允许的最大深度,抛出StackOverflowError,如果虚拟机在扩展时无法申请到足够空间则抛出OutOfMemoryError的异常。

容易想到在单线程的堆中我们不断的让一个成员变量自增,容纳这个变量的单元无法承受这个变量了,就抛出StackOverflowError了。

这就是一个请求的栈深度大于虚拟机所允许的最大深度。

还有种情况,可以开尽量多的线程,并在每个线程里调用native的方法,就自然会抛出OutOfMemoryError了。

运行时常量池溢出:运行时常量池是在方法区中的一部分,主要
保存Class文件中描述的符号引用。

可采用String类的intern方法。

方法区存放类的信息、常量、静态变量。

这部分的溢出可采用增强Class加载的方式。

JVM常见面试题

JVM常见面试题

JVM常见面试题与解答以下是一些常见的 JVM 面试题及答案:1.JVM 是什么?它有哪些主要组成部分?答案:JVM 是 Java 虚拟机,它是 Java 程序的执行环境。

JVM 主要由三部分组成:堆、栈和本地方法栈。

堆是 JVM 中最大的一部分,它用于存储对象实例。

栈是用于执行线程的,每个线程都有自己的栈,用于存储方法调用和局部变量。

本地方法栈用于支持native方法的执行。

2.JVM 中的垃圾回收是什么?有哪些垃圾收集算法?答案:JVM 中的垃圾回收是自动管理内存的过程,它自动回收不再使用的对象占用的内存。

常见的垃圾收集算法包括:标记-清除算法、复制算法、标记-整理算法和分代收集算法。

其中,标记-清除算法是最基础的算法,它通过标记哪些对象需要回收,然后清除这些对象占用的内存。

复制算法将可用内存按容量划分为两部分,一部分被标记为正在使用,另一部分被标记为空闲,当进行垃圾回收时,将正在使用的内存中的对象复制到另一部分中,然后清除当前内存中的所有对象。

标记-整理算法也是基于标记-清除算法的,不同之处在于它在清除未使用的对象后,会将剩余的对象进行整理,使内存中的空间更加紧凑。

分代收集算法是根据对象的生命周期不同,将内存分为新生代和老年代两部分,新生代用于存储新创建的对象,老年代用于存储长时间存活的对象。

3.JVM 中有哪些常见的垃圾收集器?它们的特点是什么?答案:JVM 中常见的垃圾收集器包括:Serial 收集器、Parallel 收集器、CMS 收集器和G1 收集器。

Serial 收集器是最简单的收集器,它在进行垃圾回收时会暂停所有的用户线程,因此也称为“Stop-The-World”收集器。

Parallel 收集器是并发的收集器,它在进行垃圾回收时会使用多个线程同时进行,因此可以减小垃圾回收对用户线程的影响。

CMS 收集器是并发标记清除收集器,它在标记阶段仍然需要暂停用户线程,但在清除阶段可以并发进行,因此可以减小垃圾回收对用户线程的影响。

java计算机面试题目及答案

java计算机面试题目及答案

java计算机面试题目及答案1. 什么是Java中的垃圾回收机制?垃圾回收(Garbage Collection,GC)是Java中自动内存管理的一部分,它负责识别不再被使用的对象,并释放它们占用的内存。

Java虚拟机(JVM)提供了垃圾回收器来执行这项任务,它通过跟踪对象的引用来确定哪些对象不再被需要。

2. Java中的多线程是如何实现的?Java中的多线程可以通过实现Runnable接口或继承Thread类来实现。

实现Runnable接口需要重写run()方法,然后创建一个Thread对象,将Runnable实例传递给它。

继承Thread类则需要重写run()方法,并直接创建Thread的子类实例。

3. 解释Java中的异常处理机制。

Java的异常处理机制包括try、catch和finally块。

try块用于包围可能抛出异常的代码,catch块用于捕获并处理异常,finally块则无论是否发生异常都会执行,通常用于资源的清理工作。

4. 什么是Java中的集合框架?Java集合框架是一组用于存储和处理对象集合的接口和类。

它包括List、Set、Map等接口,以及实现这些接口的类,如ArrayList、HashSet、HashMap等。

5. 请解释Java中的泛型是什么?泛型是Java 5引入的一个特性,它允许在编译时进行类型检查,从而避免运行时出现类型转换错误。

泛型可以用于类、接口和方法中,提高代码的复用性和安全性。

6. 什么是Java中的注解(Annotation)?注解是一种特殊的接口,它提供了一种元数据形式,用于在代码中添加额外的信息。

注解可以用于类、方法、变量等,并且可以被编译器或运行时环境使用。

7. 解释Java中的反射机制。

反射是Java中的一种机制,它允许程序在运行时访问和操作类的属性和方法。

通过反射,可以动态地创建对象、调用方法、修改字段等。

8. 什么是Java的序列化和反序列化?序列化是将对象的状态转换为可以存储或传输的形式的过程,通常是将对象转换为字节流。

常见JVM面试题及答案整理

常见JVM面试题及答案整理

常见JVM面试题及答案整理1. JVM是什么?它是如何工作的?答案:JVM是Java虚拟机,它是一个可以执行Java字节码的虚拟机进程。

JVM的主要工作是将Java字节码转换成特定操作系统的机器码,以便在各个平台上运行Java程序。

JVM的工作过程主要包括加载字节码文件、验证字节码、执行字节码等步骤。

2. JVM有哪些主要组成部分?答案:JVM主要包括以下几个组成部分:- 类加载器(Class Loader):负责将Java类库加载到JVM中。

- 运行时数据区(Runtime Data Area):包括方法区、堆、栈、程序计数器等。

- 执行引擎(Execution Engine):负责解释Java字节码或将其编译成本地代码执行。

- 本地库接口(Native Interface):用于与本地库(如C/C++库)进行交互。

- 本地方法库(Native Method Libraries):实现了JVM调用本地方法的功能。

3. JVM内存模型是什么?答案:JVM内存模型主要包括以下几个区域:- 方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量等数据。

- 堆(Heap):Java对象实例的存储区域,是垃圾收集的主要区域。

- 栈(Stack):线程私有,用于存储局部变量表、操作数栈、动态链接、方法出口等。

- 程序计数器(Program Counter Register):线程私有,用于存储指向下一条指令的地址。

- 本地方法栈(Native Method Stack):线程私有,为虚拟机使用到的Native方法服务。

4. 什么是垃圾收集器(Garbage Collector)?答案:垃圾收集器是JVM的一个重要组成部分,负责自动管理内存,回收不再使用的对象所占用的内存空间。

垃圾收集器的目标是确保在程序运行过程中不会出现内存泄漏,同时提高内存的使用效率。

5. 常见的垃圾收集器有哪些?答案:常见的垃圾收集器包括以下几种:- Serial收集器:单线程执行的收集器,适用于单核处理器。

jvm内存分配原理面试

jvm内存分配原理面试

jvm内存分配原理面试摘要:一、JVM 内存分配原理概述二、JVM 内存分配的具体方式三、JVM 内存管理的优势和应用场景四、面试中可能遇到的JVM 内存分配问题及解答正文:一、JVM 内存分配原理概述JVM,即Java 虚拟机,是Java 语言的核心组件之一。

它在运行Java 程序时,会负责内存的管理和分配。

JVM 内存分配原理主要涉及两个方面:内存区域的划分和内存分配策略。

首先,JVM 将内存划分为不同的区域,包括堆内存、栈内存、方法区、静态区等。

这些区域分别负责存储不同类型的数据,如堆内存主要用于存储对象实例,栈内存用于存储局部变量和方法调用。

其次,JVM 采取了一种分代回收的内存分配策略。

这种策略将堆内存划分为年轻代和老年代。

年轻代中,又包括了Eden 区和两个Survivor 区(S0 和S1)。

当一个对象被创建时,它会首先进入Eden 区。

经过一定次数的垃圾回收后,仍然存活的对象会被移到Survivor 区,最后可能被晋升到老年代。

这种分代回收策略可以有效地减少内存碎片,提高内存利用率。

二、JVM 内存分配的具体方式JVM 内存分配的具体方式主要包括以下几种:1.堆内存分配:堆内存主要用于存储对象实例。

当一个对象被创建时,JVM 会在堆内存中为它分配一块空间。

当对象不再被引用时,JVM 会通过垃圾回收机制来回收这块空间。

2.栈内存分配:栈内存用于存储局部变量和方法调用。

每个线程都有自己的栈空间,当线程创建时,JVM 会为其分配一个栈空间。

线程执行过程中,会不断地在栈空间中创建和销毁局部变量和方法调用。

当线程结束时,其对应的栈空间也会被回收。

3.方法区内存分配:方法区用于存储类和方法的元数据,如类的字节码、常量池等。

当一个类被加载时,JVM 会在方法区为它分配一块空间。

方法区的内存分配是静态的,不会随着对象的创建和销毁而改变。

4.静态区内存分配:静态区用于存储类的静态变量和静态方法。

与方法区类似,静态区的内存分配也是静态的。

Java经典面试题及答案(200题)

Java经典面试题及答案(200题)

Java经典面试题及答案(200题) Java经典面试题200道Java 基础1. JDK 和 JRE 有什么区别?JDK:Java Development Kit 的简称,Java 开发工具包,提供了Java 的开发环境和运行环境。

JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。

简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。

2. == 和 equals 的区别是什么?「== 解读」对于基本类型和引用类型 == 的作用效果是不同的,如下所示:基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;代码示例:String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

「equals 解读」equals 本质上就是 ==,只不过 String 和 Integer 等重写了equals 方法,把它变成了值比较。

jvm面试题目(3篇)

jvm面试题目(3篇)

第1篇第一部分:JVM基础概念1. 什么是JVM?- JVM(Java虚拟机)是一个可以执行Java字节码的虚拟机,它负责执行Java 程序,并且具有跨平台运行的能力。

2. JVM的主要职责是什么?- 执行Java字节码- 内存管理- 垃圾回收- 线程管理3. 请简述JVM的内存结构。

- 程序计数器:用于存储当前线程执行的字节码指令的地址。

- 虚拟机栈:为每个线程分配的内存区域,用于存储局部变量和方法调用栈。

- 本地方法栈:为使用native方法(非Java代码)的线程分配的内存区域。

- 堆:存储所有类的实例和数组的内存区域。

- 方法区:存储已被虚拟机加载的类信息、常量、静态变量等数据。

- 直接内存:一种可以指定大小的内存空间,用于直接内存访问,如NIO操作。

4. 什么是类加载器?- 类加载器负责将Java类文件加载到JVM中,并创建对应的Java类对象。

5. 常见的类加载器有哪些?- 启动类加载器(Bootstrap ClassLoader)- 扩展类加载器(Extension ClassLoader)- 应用程序类加载器(Application ClassLoader)- 用户自定义类加载器6. 什么是双亲委派模型?- 双亲委派模型是一种类加载机制,当一个类加载器请求加载一个类时,它会首先请求它的父类加载器进行加载,如果父类加载器无法加载,才会由当前类加载器加载。

第二部分:JVM内存管理7. 什么是垃圾回收(GC)?- 垃圾回收是一种自动内存管理机制,用于回收不再被使用的对象占用的内存。

8. 垃圾回收的基本原理是什么?- 垃圾回收器通过判断对象是否可达来决定是否回收对象。

如果一个对象没有任何引用指向它,那么它被认为是不可达的,可以被回收。

9. 常见的垃圾回收算法有哪些?- 标记-清除算法- 标记-整理算法- 分代收集算法(如新生代、老年代)10. 请解释分代垃圾回收机制。

- 分代垃圾回收将内存划分为几个不同的区域,如新生代和老年代,根据对象的生命周期和访问频率进行回收。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 内存模型以及分区,需要详细到每个区放什么。 JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(static 常量和 static 变量)等放在方法区 new:
方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字 节码)等数据
11.JVM 内存分哪几个区,每个区的作用是什么?
java 虚拟机主要分为以下一个区:
方法区:
1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生 GC,在这里
进行的 GC 主要是对方法区里的常量池和对类型的卸载
2. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后
是线程间通信的控制机制.JMM 定义了主内存和线程之间抽象关系。 线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地 内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是 JMM 的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬 件和编译器优化。Java 内存模型的抽象示意图如下:
2. 复制算法: 为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只 使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然 后一次性清楚完第一块内存,再将第二块上的对象复制到第一块。但是这种方式,
内存的代价太高,每次基本上都要浪费一般的内存。 于是将该算法进行了改进,内存区域不再是按照 1:1 去划分,而是将内存划分为 8:1:1 三部分,较大那份内存交 Eden 区,其余是两块较小的内存区叫 Survior 区。 每次都会优先使用 Eden 区,若 Eden 区满,就将对象复制到第二块内存区上,然 后清除 Eden 区,如果此时存活的对象太多,以至于 Survivor 不够时,会将这些对 象通过分配担保机制复制到老年代中。(java 堆又分为新生代和老年代) 3. 标记-整理 该算法主要是为了解决标记-清除,产生大量内存碎片的问题;当对象存活率较高 时,也解决了复制算法的效率问题。它的不同之处就是在清除对象的时候现将可回 收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。 4. 分代收集 现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生 代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那 么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担 保,所以可以使用标记-整理 或者 标记-清除。
14.java 中垃圾收集的方法有哪些?
1. 标记-清除: 这是垃圾收集算法中最基础的,根据名字就可以知道,它的思想就是标记哪些要被 回收的对象,然后统一回收。这种方法很简单,但是会有两个主要问题:1.效率不 高,标记和清除的效率都很低;2.会产生大量不连续的内存碎片,导致以后程序在 分配较大的对象时,由于没有充足的连续内存而提前触发一次 GC 动作。
13.简述 java 垃圾回收机制?
在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚 拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将 它们添加到要回收的集合中,进行回收。
从上图来看,线程 A 与线程 B 之间如要通信的话,必须要经历下面 2 个步骤: 1. 首先,线程 A 把本地内存 A 中更新过的共享变量刷新到主内存中去。 2. 然后,线程 B 到主内存中去读取线程 A 之前已更新过的共享变量。
16.java 类加载过程?
java 类加载需要经历一下 7 个过程: 加载 加载时类加载的第一个过程,在这个阶段,将完成一下三件事情: 1. 通过一个类的全限定名获取该类的二进制流。 2. 将该二进制流中的静态存储结构转化为方法去运行时数据结构。 3. 在内存中生成该类的 Class 对象,作为该类的数据访问入口。 验证 验证的目的是为了确保 Class 文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成 以下四钟验证: 1. 文件格式验证:验证字节流是否符合 Class 文件的规范,如主次版本号是否在当前虚拟 机范围内,常量池中的常量是否有不被支持的类型. 2. 元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不 被继承的类等。 3. 字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析, 确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转 指令是否正确等。
或者已被虚拟机调用过,那么就认为是没必要的。 如果该对象有必要执行 finalize()方法,那么这个对象将会放在一个称为 F-Queue 的对队 列中,虚拟机会触发一个 Finalize()线程去执行,此线程是低优先级的,并且虚拟机不会承 诺一直等待它运行完,这是因为如果 finalize()执行缓慢或者发生了死锁,那么就会造成 FQueue 队列一直等待,造成了内存回收系统的崩溃。GC 对处于 F-Queue 中的对象进行 第二次被标记,这时,该对象将被移除”即将回收”集合,等待回收。
虚拟机栈中引用的对象 方法区类静态属性引用的对象 方法区常量池引用的对象 本地方法栈 JNI 引用的对象 虽然这些算法可以判定一个对象是否能被回收,但是当满足上述条件时,一个对象比不一 定会被回收。当一个对象不可达 GC Root 时,这个对象并 不会立马被回收,而是出于一个死缓的阶段,若要被真正的回收需要经历两次标记 如果对象在可达性分析中没有与 GC Root 的引用链,那么此时就会被第一次标记并且进行 一次筛选,筛选的条件是是否有必要执行 finalize()方法。当对象没有覆盖 finalize()方法
12.如和判断一个对象是否存活?(或者 GC 对象的判定方 法)
判断一个对象是否存活有两种方法: 1. 引用计数法 所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象 时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说 明此对象没有被引用,也就是“死对象”,将会被垃圾回收. 引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象 A 引用对象 B,对象 B 又引用者对象 A,那么此时 A,B 对象的引用计数器都不为零,也就造成无法完成垃圾回 收,所以主流的虚拟机都没有采用这种算法。 2.可达性算法(引用链法) 该算法的思想是:从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到 GC Roots 没有任何引用链相连时,则说明此对象不可用。 在 java 中可以作为 GC Roots 的对象有以下几种:
会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。 2. 虚拟机栈是线程私有的,它的生命周期与线程相同。 3. 局部变量表里存储的是基本数据类型、returnAddress 类型(指向一条字节码指令的地 址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表 对象的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定 4.操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索 引来访问,而是压栈和出栈的方式 5.每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了 支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接 引用。 本地方法栈 本地方法栈和虚拟机栈类似,只不过本地方法栈为 Native 方法服务。 堆 java 堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这 里创建,因此该区域经常发生垃圾回收操作。 程序计数器 内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码 指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内 存区域是唯一一个 java 虚拟机规范没有规定任何 OOM 情况的区域。
堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要 在堆上分配
栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操 作数栈,方法出口等信息,局部变量表存放的是 8 大基础类型加上一个应用类型,所 以还是一个指向地址的指针
本地方法栈:主要为 Native 方法服务 程序计数器:记录当前线程执行的行号
的代码等数据。
3. 该区域是被线程共享的。
4. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池
具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量
池中。
虚拟机栈:
1. 虚拟机栈也就是我们平常所称的栈内存,它为 java 方法服务,每个方法在执行的时候都
复制算法:分为 8:1 的 Eden 区和 survivor 区,就是上面谈到的 YGC 标记整理:标记完毕之后,让所有存活的对象向一端移动 7. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。 并行收集器:串行收集器使用一个单独的线程进行收集,GC 时服务有停顿时间 串行收集器:次要回收中使用多线程来执行 CMS 收集器是基于“标记—清除”算法实现的,经过多次标记才会被清除 G1 从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个 Region 之间) 上来看是基于“复制”算法实现的 8. Minor GC 与 Full GC 分别在什么时候发生? 新生代内存不够用时候发生 MGC 也叫 YGC,JVM 内存不够的时候发生 FGC 9. 几种常用的内存调试工具:jmap、jstack、jconsole、jhat jstack 可以看当前栈的情况,jmap 查看内存,jhat 进行 dump 堆的信息 mat(eclipse 的也要了解一下) 10. 类加载的几个过程: 加载、验证、准备、解析、初始化。然后是使用和卸载了 通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文 件格式校验、元数据验证,字节码校验等。准备是对这个对象分配内存。解析是将符 号引用转化为直接引用(指针引用),初始化就是开始执行构造器的代码
相关文档
最新文档