详细介绍Java垃圾回收机制
JAVA的内存回收机制(快速入门版)

JAVA的内存回收机制(快速入门版)Java的内存回收机制是通过垃圾回收(Garbage Collection)来实现的。
垃圾回收是一种自动化的内存管理机制,它可以在程序运行时自动分配和释放内存。
Java的垃圾回收机制允许开发人员不用手动释放内存,从而减轻了编程的负担和错误。
Java的内存回收机制是基于“垃圾”的概念。
垃圾是指在程序中已经不再被使用的对象。
当一个对象不再被引用时,它就成为了垃圾。
垃圾回收器会定期扫描程序的堆内存,识别和清除垃圾对象,以便为新的对象腾出内存空间。
Java的内存回收机制是基于引用计数和可达性分析两种策略的组合。
引用计数是一种简单的方法,它通过在对象上添加一个引用计数器来跟踪对象被引用的次数。
当引用计数为0时,对象就成为垃圾。
可达性分析是一种更高级的方法,它通过从根节点(如变量、静态变量等)开始,递归地遍历对象图,标记所有可达的对象,未标记的对象就是垃圾。
Java的垃圾回收器包括几种不同的实现,如串行回收器、并行回收器和并发回收器等。
这些回收器采用不同的算法和策略来进行内存回收。
例如,串行回收器在垃圾回收过程中会暂停程序的执行,而并行回收器则会同时利用多个处理器来提高回收效率。
并发回收器则允许程序在垃圾回收过程中继续执行。
Java的内存回收机制还包括一些高级的特性,如分代回收和自适应调整。
分代回收是一种基于对象存活时间的策略,它将堆内存划分为不同的代(Generation),并根据对象的特性来选择合适的回收算法。
自适应调整是一种动态调整垃圾回收参数的机制,它可以根据程序的运行情况来调整回收策略,以达到更好的性能。
总的来说,Java的内存回收机制是一种自动化的内存管理机制,它通过识别和清除垃圾对象来释放内存空间。
Java提供了多种不同的垃圾回收器和高级特性,可以根据不同的应用场景来选择合适的策略。
掌握Java的内存回收机制可以帮助开发人员编写高效、可靠的程序。
jvm内存垃圾回收机制

Java虚拟机(JVM)的内存垃圾回收机制主要涉及自动内存管理和垃圾回收两个核心功能。
自动内存管理主要是针对对象内存的回收和对象内存的分配。
JVM的堆是垃圾收集器管理的主要区域,也被称作GC堆(Garbage Collected Heap)。
大部分情况下,对象都会首先在Eden区域分配。
在一次新生代垃圾回收后,如果对象还存活,则会进入s0或者s1,并且对象的年龄还会加1(Eden区->Survivor区后对象的初始年龄变为1),当它的年龄增加到一定程度(默认为15岁),就会被晋升到老年代中。
垃圾回收是JVM自动内存管理的另一个重要方面。
主要有两种通用的垃圾回收方法:引用计数法和可达性分析算法。
引用计数法为每个对象增加一个计数器,当该对象被引用时,计数器加一,当引用失效时,计数器减一。
当计数器为零时,该对象就可以被回收了。
这种方法无法解决循环引用的问题。
可达性分析算法是通过GC Root的对象作为起始节点,通过引用向下搜索,所走过的路径称为引用链。
当对象没有任何一条引用链链接的时候,就会被认定为垃圾。
可作为GC Root的对象包括:类加载器,Thread,虚拟机栈的本地变量表,static成员,常量引用,本地方法栈的变量等等。
大部分情况下,对象都会首先在Eden区域分配,在一次新生代
垃圾回收后,如果对象还存活,则会进入s0或者s1,并且对象的年龄还会加1(Eden区->Survivor区后对象的初始年龄变为1),当它的年龄增加到一定程度(默认为15岁),就会被晋升到老年代中。
以上信息仅供参考,如果还想了解更多信息或遇到相关问题,建议咨询专业人士。
java gc讲解

Java中的垃圾回收(Garbage Collection,GC)是自动内存管理的一种机制。
Java程序员不需要显式地进行内存管理,因为Java虚拟机(JVM)会自动管理内存。
垃圾回收器(GC器)会定期检查堆内存中不再使用的对象,并将其释放,以便其他对象可以使用这些空间。
Java的GC机制基于以下几个原则:
1.对象只有在没有被引用时才会被回收。
垃圾回收器会定期扫描堆内存,找出不再被
引用的对象,并将它们从堆内存中删除。
2.Java虚拟机中的堆内存被分成若干个不同的代。
新创建的对象会被分配到年轻代
(Young Generation),经过多次垃圾回收后,如果仍然存活,则会被移动到年老代(Old Generation)。
年老代中存活时间较长的对象可能会被移动到持久代(Permanent Generation),其中主要存放JVM使用的类信息、方法信息等。
3.垃圾回收器的工作是尽可能快地释放内存,同时保证程序的性能。
为了实现这一目
标,Java中使用了不同类型的垃圾回收器,例如串行回收器、并发标记-清除回收器、并行回收器、G1垃圾回收器等。
每个垃圾回收器都有其优缺点,应根据应用程序的需求进行选择。
Java中的垃圾回收机制可以大大简化程序员的工作,并提高代码的可靠性和稳定性。
但是,Java垃圾回收也会带来一些额外的开销,例如GC停顿时间较长、内存占用较高等问题。
因此,程序员需要了解Java垃圾回收机制的工作原理,并针对具体情况进行调整和优化,以提高程序的性能和可靠性。
深入理解Java垃圾回收机制

深入理解Java垃圾回收机制Java作为一门面向对象的编程语言,其垃圾回收机制是其核心功能之一。
Java垃圾回收机制以其高效、可靠的特性,为程序员们带来了很大的便利。
但对于初学者和一些开发者,Java垃圾回收机制还是比较神秘的。
本文将从深入理解Java垃圾回收机制方面进行探讨。
Java垃圾回收机制的概念对于Java垃圾回收机制,我们首先需要了解的是垃圾回收机制的概念。
简单来说,垃圾回收机制就是在程序运行时,自动清除不再使用的对象,并回收其占用的内存空间。
这样做既能够让程序节省内存空间,也可以避免内存泄漏等问题的发生。
Java垃圾回收机制的执行方式Java垃圾回收机制的执行方式可以分为两种,即标记-清除法和复制-清除法。
1. 标记-清除法标记-清除法是指,当垃圾回收机制开始工作时,它会标记所有正在使用的对象和被使用的对象之间的关系。
然后,它会扫描程序中所有的对象,并将被使用的对象打上“标记”,将不再使用的对象打上“不可达标记”。
最后,垃圾回收机制回收那些被打上“不可达标记”的对象,并释放其占用的内存空间。
2. 复制-清除法复制-清除法是指,当垃圾回收机制开始工作时,它会将整个可用内存区域分为两个相等的部分,分别称为“From”空间和“To”空间。
当程序对象在进行分配内存时,垃圾回收机制会将对象分配在From空间中。
当From空间被占满时,垃圾回收机制会暂停程序运行,并将所有存活的对象从From空间复制到To空间,然后将From空间进行清除,最后将To空间作为新的From空间。
这种方式既能够让内存得到有效的利用,也可以确保程序的稳定运行。
Java垃圾回收机制的内存分区Java垃圾回收机制的内存分区可以分为程序计数器、虚拟机栈、方法区、堆(Heap)四个部分。
其中,程序计数器保存下一个要执行的指令的地址;虚拟机栈保存线程方法的信息;方法区保存类、方法及常量池的信息;堆是程序运行时所使用的内存区域。
Java垃圾回收机制的垃圾收集器Java垃圾回收机制的垃圾收集器是Java虚拟机中专门负责回收垃圾对象的模块,其具体实现方式取决于Java虚拟机的版本和厂商。
Java中的垃圾回收机制是如何工作的

Java中的垃圾回收机制是如何工作的在 Java 编程的世界里,垃圾回收机制是一项至关重要的特性,它就像是一位默默工作的“清洁工”,负责自动管理内存的分配和释放,让开发者能够更专注于业务逻辑的实现,而不必过度操心内存管理的繁琐细节。
要理解 Java 中的垃圾回收机制是如何工作的,首先得明白什么是垃圾。
在 Java 中,当一个对象不再被任何引用所指向,也就是没有任何途径能够访问到它时,这个对象就被视为垃圾。
想象一下,一个对象就像是一个房间,如果没有钥匙能打开这个房间的门,那么这个房间里的东西也就没有用了,它就变成了垃圾。
那么,Java 是如何发现这些垃圾对象的呢?这主要通过两种方式:引用计数法和可达性分析算法。
引用计数法的原理比较简单直观。
给每个对象添加一个引用计数器,每当有一个地方引用这个对象时,计数器就加 1;当引用失效时,计数器就减 1。
当计数器的值为 0 时,就表明这个对象没有被引用,可以被当作垃圾回收。
然而,这种方法存在一个问题,那就是无法解决循环引用的情况。
比如对象 A 引用了对象 B,对象 B 又引用了对象 A,但除此之外没有其他地方引用它们,按照引用计数法,它们的计数器都不为 0,但实际上它们已经不再被使用了,是应该被回收的垃圾。
相比之下,可达性分析算法就更强大和准确。
它从一些被称为“GC Roots”的对象出发,沿着引用链向下搜索。
如果一个对象不能从任何“GC Roots”对象通过引用链到达,那么这个对象就被认为是不可达的,是垃圾。
“GC Roots”对象通常包括虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象以及本地方法栈中 JNI(即 Java Native Interface)引用的对象。
当垃圾回收器确定了哪些对象是垃圾之后,就会开始进行回收操作。
Java 的垃圾回收算法主要有标记清除算法、复制算法、标记压缩算法以及分代收集算法。
Java垃圾回收与回收机制

全面分析Java的垃圾回收机制Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。
Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。
一般来说,堆的是由垃圾回收来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。
垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。
垃圾收集的意义在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。
JVM的一个系统级线程会自动释放该内存块。
垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。
当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。
事实上,除了释放没用的对象,垃圾收集也可以清除内存记录碎片。
由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。
碎片是分配给对象的内存块之间的空闲内存洞。
碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。
垃圾收集能自动释放内存空间,减轻编程的负担。
这使Java 虚拟机具有一些优点。
首先,它能使编程效率提高。
在没有垃圾收集机制的时候,可能要花许多时间来解决一个难懂的存储器问题。
在用Java语言编程的时候,靠垃圾收集机制可大大缩短时间。
其次是它保护程序的完整性,垃圾收集是Java语言安全性策略的一个重要部份。
垃圾收集的一个潜在的缺点是它的开销影响程序性能。
Java虚拟机必须追踪运行程序中有用的对象,而且最终释放没用的对象。
综述java运行中垃圾回收机制

综述java运行中垃圾回收机制Java作为一门面向对象的高级编程语言,一直以来都备受程序员们的青睐。
在Java的编写过程中,垃圾回收机制是非常重要的一部分,它可以帮助程序员解决内存泄漏的问题,提高程序的效率和稳定性。
本篇文章将综述Java运行中垃圾回收机制的相关知识,包括垃圾回收原理、垃圾回收算法和垃圾回收器等内容,旨在为程序员们更好地理解和掌握Java垃圾回收机制提供帮助。
一、垃圾回收原理垃圾回收原理是Java垃圾回收机制的核心部分,它是Java虚拟机对内存分配和内存释放机制的实现。
Java中的垃圾回收机制在堆内存分配中起到了至关重要的作用,可以有效地解决程序中出现的内存溢出和内存泄漏问题,提高了程序的效率和稳定性。
下面我们将对Java垃圾回收原理进行详细介绍。
1. 垃圾的定义Java程序中的垃圾指的是没有被任何引用变量引用的对象。
当程序中的某个对象没有被引用时,JVM就会将这个对象视为垃圾,等待垃圾回收器进行回收。
2. 标记清除算法标记清除算法是Java中最常见的垃圾回收算法,它采用了两个阶段进行垃圾回收。
在第一个阶段,垃圾回收器会遍历整个堆中的对象,标记出仍然被引用的对象。
在第二个阶段,回收器会扫描整个堆中未被标记的对象,将其清除并回收内存。
这种算法的缺点在于,会产生大量的内存碎片,导致内存不连续的情况,降低了程序的性能。
3. 复制算法复制算法是Java中另一种常见的垃圾回收算法,它将堆内存划分为两个区域,一个区域存放已标记的对象,另一个区域存放未标记的对象。
在垃圾回收过程中,已标记的对象会被复制到未标记的区域中,未标记的区域会被全部清除,然后两个区域进行角色交换。
这种算法的优点在于,复制操作非常高效,可以避免内存碎片问题,但是同时也需要消耗一部分的内存空间。
4. 标记整理算法标记整理算法是一种比较高效的垃圾回收算法,它采用标记清除算法和复制算法相结合的方式进行内存回收。
在标记清除算法中,由于存在内存碎片问题,因此需要对内存空间进行整理,而标记整理算法就是采用了这种方式来解决问题。
javagc回收机制

javagc回收机制即java垃圾回收机制,是自动的内存管理机制,它可以在程序执行时自动回收无用的对象,以释放内存空间。
Java 中的垃圾回收机制主要包括以下几个方面:
1. 对象的创建和销毁:当一个对象被创建时,Java 虚拟机会为其分配一块内存空间,并记录其在内存中的位置。
当对象不再被引用时,Java 虚拟机会将其标记为垃圾对象,并在适当的时候回收它所占用的内存空间。
2. 垃圾收集算法:Java 中使用的垃圾收集算法主要有标记-清除算法和复制算法。
标记-清除算法会先标记所有还在使用中的对象,然后清除所有未被标记的对象;复制算法则会将内存分为两个区域,将还在使用中的对象复制到其中一个区域,然后清除另一个区域中的所有对象。
3. 垃圾收集器的选择和配置:Java 中提供了多种垃圾收集器,如Serial GC、Parallel GC、CMS GC 等。
可以根据程序的特点和运行环境的需求选择合适的垃圾收集器和配置参数,以达到最优的垃圾回收效果。
4. 垃圾回收的影响:垃圾回收会占用一定的系统资源,可能会影响程序的性能。
因此,在进行垃圾回收时需要注意控制回收的频率和时间,以避免对程序的性能造成过大的影响。
总的来说,Java 中的垃圾回收机制是一个自动化的、高效的内存管理机制,可以帮助开发人员避免内存泄漏等问题,提高程序的稳定性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详细介绍Java垃圾回收机制垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。
垃圾收集的目的在于清除不再使用的对象。
GC通过确定对象是否被活动对象引用来确定是否收集该对象。
GC首先要判断该对象是否是时候可以收集。
两种常用的方法是引用计数和对象引用遍历。
引用计数收集器引用计数是垃圾收集器中的早期策略。
在这种方法中,堆中每个对象(不是引用都一个引用计数。
当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。
当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b 引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。
任何引用计数为0的对象可以被当作垃圾收集。
当一个对象被垃圾收集时,它引用的任何对象计数减1。
优点:引用计数收集器可以很快的执行,交织在程序运行中。
对程序不被长时间打断的实时环境比较利。
缺点:无法检测出循环引用。
如父对象有一个对子对象的引用,子对象反过来引用父对象。
这样,他们的引用计数永远不可能为0.跟踪收集器早期的JVM使用引用计数,现在大多数JVM采用对象引用遍历。
对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。
如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。
在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
下一步,GC要删除不可到达的对象。
删除时,有些GC只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。
这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。
因此,许多GC可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。
为此,GC需要停止其他的活动活动。
这种方法意味着所有与应用程序相关的工作停止,只有GC运行。
结果,在响应期间增减了许多混杂请求。
另外,更复杂的 GC 不断增加或同时运行以减少或者清除应用程序的中断。
有的GC使用单线程完成这项工作,有的则采用多线程以增加效率。
一些常用的垃圾收集器(1)标记-清除收集器这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。
这种收集器一般使用单线程工作并停止其他操作。
并且,由于它只是清除了那些未标记的对象,而并没有对标记对象进行压缩,导致会产生大量内存碎片,从而浪费内存。
(2)标记-压缩收集器时也叫标记-清除-压缩收集器,与标记-清除收集器相同的标记阶段。
在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。
这种收集器也停止其他操作。
(3)复制收集器这种收集器将堆栈分为两个域,常称为半空间。
每次仅使用一半的空间,JVM 生成的新对象则放在另一半空间中。
GC运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。
这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。
并且对于指定大小堆来说,需要两倍大小的内存,因为任何时候都只使用其中的一半。
(4) 增量收集器增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾,也可理解为把堆栈分成一小块一小块,每次仅对某一个块进行垃圾收集。
这会造成较小的应用程序中断时间,使得用户一般不能觉察到垃圾收集器正在工作。
(5)分代收集器复制收集器的缺点是:每次收集时,所的标记对象都要被拷贝,从而导致一些生命周期很长的对象被来回拷贝多次,消耗大量的时间。
而分代收集器则可解决这个问题,分代收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。
JVM生成的新对象一般放在其中的某个域中。
过一段时间,继续存在的对象(非短命对象)将获得使用期并转入更长寿命的域中。
分代收集器对不同的域使用不同的算法以优化性能。
并行收集器并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。
在多CPU机器上使用多线程技术可以显著的提高java应用程序的可扩展性。
最后,贴出一个非常简单的跟踪收集器的例图,以便大家加深对收集器的理解:跟踪收集器图例使用垃圾收集器要注意的地方下面将提出一些有关垃圾收集器要注意的地方,垃圾收集器知识很多,下面只列出一部分必要的知识:(1)每个对象只能调用finalize( )方法一次。
如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。
(2)垃圾收集器跟踪每一个对象,收集那些不可触及的对象(即该对象不再被程序引用了),回收其占有的内存空间。
但在进行垃圾收集的时候,垃圾收集器会调用该对象的finalize( )方法(如果有)。
如果在finalize()方法中,又使得该对象被程序引用(俗称复活了),则该对象就变成了可触及的对象,暂时不会被垃圾收集了。
但是由于每个对象只能调用一次finalize( )方法,所以每个对象也只可能 "复活 "一次。
(3)Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。
但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。
(4)垃圾收集器不可以被强制执行,但程序员可以通过调研System.gc方法来建议执行垃圾收集。
记住,只是建议。
一般不建议自己写System.gc,因为会加大垃圾收集工作量。
详解Java GC的工作原理概要: JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,另外JVM分别对新生代和旧生代采用不同的垃圾回收机制。
1. 首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示。
1)堆所通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。
堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成,结构图如下所示:新生代。
新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例旧生代。
用于存放新生代中经过多次垃圾回收仍然存活的对象2)栈每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果3)本地方法栈用于支持native方法的执行,存储了每个native方法调用的状态4)方法区存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。
JVM用持久代(PermanetGeneration)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
介绍完了JVM内存组成结构,下面我们再来看一下JVM垃圾回收机制。
2. JVM垃圾回收机制JVM分别对新生代和旧生代采用不同的垃圾回收机制新生代的GC:新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。
新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。
当连续分配对象时,对象会逐渐从eden到survivor,最后到旧生代,用javavisualVM来查看,能明显观察到新生代满了后,会把对象转移到旧生代,然后清空继续装载,当旧生代也满了后,就会报outofmemory的异常,如下图所示:在执行机制上JVM提供了串行GC(SerialGC)、并行回收GC(ParallelScavenge)和并行GC(ParNew)1)串行GC在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定2)并行回收GC在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式,可用-XX:+UseParallelGC 来强制指定,用-XX:ParallelGCThreads=4来指定线程数3)并行GC与旧生代的并发GC配合使用旧生代的GC:旧生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗。
在执行机制上JVM提供了串行GC(SerialMSC)、并行GC(parallelMSC)和并发GC(CMS),具体算法细节还有待进一步深入研究。
以上各种GC机制是需要组合使用的,指定方式由下表所示:。