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调优面试题对于Java开发人员来说,JVM(Java Virtual Machine)调优是非常重要的一项技能。

在面试中,常常会遇到与JVM调优相关的问题,以评估候选人对于JVM及其性能优化方面的理解。

本文将通过回答一些常见的JVM调优面试题,来帮助读者更好地理解JVM调优的相关知识。

1. 什么是JVM调优,为什么需要进行JVM调优?JVM调优是通过配置和优化JVM的参数、设置和调整应用程序的资源分配,以提升Java应用程序的性能和稳定性。

JVM调优的目的是合理利用计算机的资源,使得Java应用程序能够更高效地运行,并且能够及时地垃圾回收,避免内存溢出等问题。

2. JVM的内存模型有哪些部分,每个部分的作用是什么?JVM的内存模型包括堆(Heap)、栈(Stack)、方法区(Method Area)和本地方法栈(Native Method Stack)四部分:- 堆用于存储Java实例对象和数组,是Java程序运行时动态分配内存的地方。

- 栈用于存储方法的执行过程中的局部变量、方法参数、返回值和方法调用的状态信息。

- 方法区用于存储类、方法和常量的信息,包括静态变量、类的字节码等。

- 本地方法栈用于存储调用本地方法(Native Method)的信息。

本地方法是用其他语言(如C、C++)编写的,在Java应用程序中使用JNI(Java Native Interface)调用。

3. 如何进行堆内存调优?堆内存调优主要是通过调整JVM的堆大小参数来实现的。

可以通过以下两个参数进行配置:- -Xms:指定堆的初始大小。

- -Xmx:指定堆的最大大小。

增加-Xms参数的值可以降低垃圾收集的频率,减少系统负担。

增加-Xmx参数的值可以分配更多的内存给Java应用程序,以支持更大规模的运行。

4. 如何进行栈内存调优?栈内存调优主要是关注线程数和栈大小。

可以通过以下两个参数进行配置:- -Xss:指定单个线程的栈大小。

动力节点 面试题 JVM

动力节点 面试题 JVM

JVM相关面试题1.JVM运行时内存结构1.由如下图构成。

Runtime DataArea有如下几个区,其中PC程序计数器、虚拟机栈和本地方法栈是线程独享的,堆和方法区是线程共享的。

Classload用来加载class文件,执行引擎用来执行程序,本地方法接口调用本地方法库。

2.javastack比较简单,每一个都是一个栈帧,每个栈帧由三部分构成。

局部变量区、操作数区和帧数据区。

局部变量是一个以数组形式管理的内存区,一般第0位是指向自己的this引用;其他的都是基本数据类型和reference类型和returnedAddress类型。

操作数区不是通过索引来访问,通过入栈出栈来访问,是临时数据的存储区域,比方说数学计算。

帧数据区是保存一些指向常量池的指针,需要常量数据时就通过这个指针来访问常量池数据。

3. 共享内存区:分为permanent space、old space、From survivor、Tosurvivor和Eden。

其中premanent包括runtime constantpool和已加载的类信息和方法信息。

Old space(tenuredgeneration)包含生命周期长的存活对象。

Fromsurvivor和Eden存放存活比较短的对象,Tosurvivor是用来复制保存存活的对象。

4.JVM参数设置。

堆:-Xmx:最大堆内存,如:-Xmx512m-Xms:初始时堆内存,如:-Xms256m-XX:MaxNewSize:最大年轻区内存-XX:NewSize:初始时年轻区内存.通常为 Xmx 的 1/3 或 1/4。

新生代= Eden + 2 个 Survivor 空间。

实际可用空间为 = Eden + 1 个Survivor,即 90%-XX:MaxPermSize:最大持久带内存-XX:PermSize:初始时持久带内存-XX:+PrintGCDetails。

打印 GC 信息-XX:NewRatio 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3-XX:SurvivorRatio 新生代中 Eden 与 Survivor 的比值。

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的序列化和反序列化?序列化是将对象的状态转换为可以存储或传输的形式的过程,通常是将对象转换为字节流。

java面试题jvm

java面试题jvm

java面试题jvm1. 什么是JVM?Java虚拟机(Java Virtual Machine,JVM)是Java平台的基石,它是Java程序运行的环境。

JVM充当了Java应用程序和操作系统之间的中间层,负责解释和执行Java字节码。

2. JVM的架构JVM的架构可以分为三层:类装载器子系统、运行时数据区和执行引擎。

1) 类装载器子系统:负责将Java类加载到内存中。

它将Java字节码文件加载到JVM并转换为可执行的类。

2) 运行时数据区:包含了JVM运行时需要的各种数据结构。

常见的包括方法区、堆、栈和PC寄存器等。

- 方法区:用于存储类的结构信息,如类的字段、方法、构造方法等。

- 堆:用于存储对象实例,是Java程序运行时的动态内存分配区域。

- 栈:用于保存线程执行方法的调用和局部变量等信息。

- PC寄存器:记录当前执行的字节码指令地址。

3) 执行引擎:执行引擎负责执行字节码指令。

它将字节码解释或编译为本地机器码执行。

3. JVM内存模型JVM内存模型定义了进程在运行时所需的内存布局和访问规则。

1) 方法区:用于存储类的结构信息,包括类的字段、方法、构造方法等。

2) 堆:用于存储对象实例和数组。

堆是Java虚拟机管理的最大一块内存区域,是Java程序在运行时分配内存的主要区域。

3) 栈:栈由多个栈帧组成,每个方法调用时都会创建一个栈帧。

栈帧保存了方法的局部变量、操作数栈、动态链接和方法返回地址等信息。

4) 本地方法栈:与栈类似,用于存储本地方法调用的相关信息。

5) PC寄存器:记录当前线程执行的字节码指令地址。

6) 直接内存:JVM直接使用操作系统的内存,通过本机直接内存来提高IO性能。

4. JVM垃圾回收JVM通过垃圾回收(Garbage Collection,GC)机制清除不再使用的对象。

JVM的垃圾回收分为两个阶段:标记阶段和清除阶段。

1) 标记阶段:JVM会标记出所有仍然被引用的对象,从根对象(如线程栈中的对象、静态变量等)开始遍历整个对象图,并将可达对象标记为存活对象。

jvm 高级面试题

jvm 高级面试题

jvm 高级面试题JVM(Java Virtual Machine)是Java编程语言的运行环境,它通过虚拟机来执行Java字节码。

对于Java开发者来说,理解JVM的原理和工作机制是非常重要的。

在面试中,常常会涉及与JVM相关的问题。

本文将介绍一些JVM高级面试题,帮助读者更好地准备面试。

1. 什么是JVM?它的主要组成部分是什么?JVM是一种在计算机操作系统和硬件之间创建虚拟计算机的软件,它执行Java字节码。

JVM的主要组成部分包括:类加载器(ClassLoader)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine)以及本地接口(Native Interface)。

2. 请解释一下Java的内存模型。

Java的内存模型指的是Java程序运行时的内存使用方式。

Java内存模型分为线程私有的部分和线程共享的部分。

线程私有的部分包括程序计数器、虚拟机栈和本地方法栈;线程共享的部分包括堆和方法区。

3. 什么是类加载器?类加载器有哪些类型?类加载器是负责将类的字节码加载到JVM中并转换成Java对象的组件。

JVM中的类加载器分为三个层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。

4. 请解释一下Java的垃圾回收机制。

Java的垃圾回收机制是指JVM在运行时自动回收不再使用的内存,以避免内存泄漏和提高内存利用率。

JVM通过使用垃圾收集器(Garbage Collector)来实现自动回收。

常见的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法等。

5. 什么是堆内存?堆内存的大小如何设置?堆内存是在JVM启动时创建的,用于存储对象实例。

堆内存的大小可以通过JVM参数进行设置,常用的参数包括-Xms和-Xmx。

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.静态区内存分配:静态区用于存储类的静态变量和静态方法。

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 Genspace)?JVM 的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。

它在JVM 启动的时候被创建。

对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。

堆内存是由存活和死亡的对象组成的。

存活的对象是应用可以访问的,不会被垃圾回收。

死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。

一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

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

五. 简述Java 垃圾回收机制。

在Java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。

在JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

六. 如何判断一个对象是否存活?(或者GC 对象的判定方法)判断一个对象是否存活有两种方法:1. 引用计数法所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。

当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收.引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象A 引用对象B,对象B 又引用者对象A,那么此时A、B 对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法。

2. 可达性算法(引用链法)该算法的思想是:从一个被称为GC Roots 的对象开始向下搜索,如果一个对象到GC Roots 没有任何引用链相连时,则说明此对象不可用。

在Java 中可以作为GC Roots 的对象有以下几种:•虚拟机栈中引用的对象•方法区类静态属性引用的对象•方法区常量池引用的对象•本地方法栈JNI引用的对象虽然这些算法可以判定一个对象是否能被回收,但是当满足上述条件时,一个对象比不一定会被回收。

当一个对象不可达GC Root 时,这个对象并不会立马被回收,而是出于一个死缓的阶段,若要被真正的回收需要经历两次标记.如果对象在可达性分析中没有与GC Root 的引用链,那么此时就会被第一次标记并且进行一次筛选,筛选的条件是是否有必要执行finalize() 方法。

当对象没有覆盖finalize() 方法或者已被虚拟机调用过,那么就认为是没必要的。

如果该对象有必要执行finalize() 方法,那么这个对象将会放在一个称为F-Queue 的对队列中,虚拟机会触发一个Finalize() 线程去执行,此线程是低优先级的,并且虚拟机不会承诺一直等待它运行完,这是因为如果finalize() 执行缓慢或者发生了死锁,那么就会造成F-Queue 队列一直等待,造成了内存回收系统的崩溃。

GC 对处于F-Queue 中的对象进行第二次被标记,这时,该对象将被移除”即将回收”集合,等待回收。

七. 垃圾回收的优点和原理。

并考虑2 种回收机制。

Java 语言中一个显著的特点就是引入了垃圾回收机制,使C++ 程序员最头疼的内存管理的问题迎刃而解,它使得Java 程序员在编写程序的时候不再需要考虑内存管理。

由于有个垃圾回收机制,Java 中的对象不再有“作用域”的概念,只有对象的引用才有"作用域"。

垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。

垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

八. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?对于GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。

通常,GC 采用有向图的方式记录和管理堆(heap)中的所有对象。

通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。

当GC 确定一些对象为“不可达”时,GC 就有责任回收这些内存空间。

可以。

程序员可以手动执行System.gc(),通知GC 运行,但是Java 语言规范并不保证GC 一定会执行。

九. Java 中会存在内存泄漏吗,请简单描述。

所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。

Java 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。

由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC 也是可以回收它们的,例如下面的代码可以看到这种情况的内存回收:import java.io.IOException;public class GarbageTest {/*** @param args* @throws IOException*/public static void main(String[] args) throws IOException {// TODO Auto-generated method stubtry {gcTest();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("has exited gcTest!");System.in.read();System.in.read();System.out.println("out begin gc!");for(int i=0;i<100;i++){System.gc();System.in.read();System.in.read();}}private static void gcTest() throws IOException { System.in.read();System.in.read();Person p1 = new Person();System.in.read();System.in.read();Person p2 = new Person();p1.setMate(p2);p2.setMate(p1);System.out.println("before exit gctest!");System.in.read();System.in.read();System.gc();System.out.println("exit gctest!");}private static class Person{byte[] data = new byte[20000000];Person mate = null;public void setMate(Person other){mate = other;}}}Java 中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是Java 中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java 中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map 对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。

相关文档
最新文档