GC详解及优化
jvm的gc原理

jvm的gc原理JVM的GC原理一、概述JVM(Java虚拟机)是Java程序运行的环境,其中最重要的组成部分之一就是垃圾回收(Garbage Collection,简称GC)机制。
GC的作用是自动管理程序中的内存,及时释放不再使用的对象,以避免内存泄漏和内存溢出的问题。
本文将对JVM的GC原理进行详细介绍。
二、垃圾回收算法1. 标记-清除算法标记-清除算法是最基本的垃圾回收算法之一。
它的过程分为两个阶段:标记阶段和清除阶段。
在标记阶段,GC会从根节点(一般是程序中的静态变量和栈中的引用)开始,递归地遍历对象图,标记出所有被引用的对象。
在清除阶段,GC会遍历整个堆,清除所有未被标记的对象。
2. 复制算法复制算法是针对标记-清除算法的改进。
它将堆分为两个区域,每次只使用其中一个区域。
当一个区域的对象被标记后,将其复制到另一个区域中,然后清除原来的区域。
这样可以解决碎片问题,但是需要额外的空间来存储复制的对象。
3. 标记-整理算法标记-整理算法是对标记-清除算法的改进。
它的过程与标记-清除算法类似,但是在清除阶段,标记-整理算法会将存活的对象向一端移动,然后清除边界外的所有对象。
这样可以解决碎片问题,并且不需要额外的空间。
4. 分代算法分代算法是针对对象的生命周期不同而提出的。
一般来说,对象的生命周期可以分为年轻代和老年代。
年轻代中的对象生命周期较短,老年代中的对象生命周期较长。
分代算法将堆分为年轻代和老年代两个区域,分别采用不同的垃圾回收算法。
年轻代一般使用复制算法,老年代一般使用标记-清除算法或标记-整理算法。
三、GC的执行过程1. 初始标记初始标记阶段是GC的第一步,它的目的是标记出所有的根对象,并且停止所有的应用线程。
这个过程是短暂的,因为只需要标记出与根对象直接关联的对象。
2. 并发标记并发标记阶段是GC的核心步骤,它的目的是通过并发执行来标记出所有的存活对象。
在这个阶段,GC会遍历整个堆,标记出与根对象直接或间接关联的存活对象。
GC是什么方案

GC是什么方案GC,全称为垃圾回收(Garbage Collection),是一种自动内存管理的方案。
在编程语言中,当我们创建对象或分配内存时,需要手动释放已使用的内存,以防止内存泄漏或资源浪费。
而GC方案可以自动管理内存,使程序员能够专注于业务逻辑开发,而不需要手动释放内存。
GC方案的基本原理是通过定期扫描内存,检测不再使用的对象或无法访问的对象,并释放它们所占用的内存空间。
这样可以确保内存始终处于良好的状态,从而提高程序的性能和稳定性。
在GC方案中,有几个重要的概念需要理解。
首先是垃圾对象,指的是那些不再被程序使用的对象。
当对象不再被引用时,它就成为了垃圾对象。
垃圾对象占用内存空间,但对程序没有任何作用,因此需要被回收。
其次是引用计数法。
引用计数法是GC方案的一种实现方式,它为每个对象维护一个引用计数器,记录有多少个引用指向该对象。
当引用计数器减少到零时,意味着该对象没有被引用,成为垃圾对象,可以被回收。
还有另一种常用的GC方案是标记-清除法。
标记-清除法的基本思想是,在垃圾回收过程中,首先对所有的根节点进行标记,然后从根节点出发,递归地遍历所有的对象,将能够访问到的对象进行标记。
标记完成后,将未标记的对象回收。
除了引用计数法和标记-清除法,还有其他的GC方案,如复制算法、标记-整理算法等,每种方案都有其适用的场景和优缺点。
在实际应用中,GC方案通常由编程语言或虚拟机来实现。
常见的编程语言如Java、C#等,都具备了垃圾回收机制。
对于程序员而言,使用语言提供的垃圾回收机制,可以简化内存管理的工作,提高开发效率。
但同时,也需要注意合理使用内存,避免出现内存泄漏或高额的内存消耗。
总结而言,GC是一种自动内存管理的方案,通过定期扫描内存,释放不再使用的对象所占用的内存空间。
不同的GC方案有不同的实现方式和适用场景,程序员需要根据具体情况选择适合的GC方案。
使用GC方案,可以减轻程序员的负担,提高代码的可维护性和可扩展性。
gc (allocation failure)注释

GC(垃圾收集)是一种自动内存管理的技术,被广泛应用于现代计算机系统中。
GC的主要作用是在程序运行过程中自动地回收不再使用的内存,从而减少内存泄漏和提高程序的性能。
在GC过程中,可能会出现“allocation failure”(分配失败)的问题,这对程序的稳定性和性能会产生一定的影响。
本文将针对GC(allocation failure)问题展开讨论,包括其原因、解决方法和对程序的影响。
1. GC(allocation failure)问题的原因GC(allocation failure)问题通常是由于内存分配过程中出现了失败的情况而导致的。
内存分配失败可能由以下几个方面的原因引起:(1)内存碎片:在程序运行过程中,内存会产生碎片,导致没有足够的连续内存空间来分配给程序使用。
(2)内存泄漏:程序在使用内存的过程中,如果存在内存泄漏的情况,就会导致内存空间的不断累积,最终导致内存分配失败。
(3)内存申请量过大:程序在一次性申请内存空间过大,超出了系统的内存限制,就会导致内存分配失败。
2. GC(allocation failure)问题的解决方法针对GC(allocation failure)问题,可以采取以下几种途径来解决:(1)优化内存分配算法:通过优化内存分配算法来减少内存碎片的产生,可以有效地解决内存分配失败的问题。
(2)定期进行内存清理:定期对程序进行内存清理,释放不再使用的内存空间,可以减少内存泄漏导致的内存分配失败。
(3)限制单次内存申请量:对程序的内存申请量进行限制,避免一次性申请过大的内存空间,从而避免内存分配失败的情况发生。
3. GC(allocation failure)问题对程序的影响GC(allocation failure)问题对程序的影响主要体现在以下几个方面:(1)程序的稳定性下降:GC(allocation failure)问题会导致程序在运行过程中出现内存分配失败的情况,从而影响程序的稳定性。
gc常用算法

gc常用算法垃圾收集(Garbage Collection,GC)是一种自动内存管理的技术,用于释放程序中不再使用的内存空间,以避免内存泄漏和内存碎片化。
在现代编程语言和运行环境中,有几种常用的GC算法,包括标记-清除算法、复制算法、标记-整理算法和分代算法。
标记-清除算法是最基本的GC算法之一。
它的原理是通过标记所有活动对象,然后清除所有未标记的对象。
标记过程通常由根对象开始,通过遍历对象图的方式,将可达的对象标记为活动对象。
清除过程则遍历整个堆,回收未被标记的对象的内存空间。
标记-清除算法的优点是灵活性高,适用于任何内存分配和释放的场景。
然而,它的缺点是会产生大量的碎片化内存。
复制算法是另一种常用的GC算法,它将内存空间一分为二,每次只使用其中一块,当这块内存满了之后,将所有活动对象复制到另一块未使用的内存块中,然后清除之前使用的内存块。
复制算法的优点是不会产生碎片化内存,但缺点是需要耗费一定的内存空间来实现复制操作。
标记-整理算法结合了标记-清除算法和复制算法的优点。
它的工作方式是标记所有活动对象,然后将它们向一端移动,然后清除端边界之外的内存空间。
通过这种方式,标记-整理算法不仅能够解决标记-清除算法的碎片化问题,还能够避免复制算法的内存浪费。
分代算法是一种将内存空间按对象存活时间分为多个代的GC算法。
它基于一个观察:大部分对象很快就会变得不可达。
分代算法将内存空间划分为新生代和老年代,根据对象的存活时间分别采用适当的GC算法进行回收。
新生代通常使用复制算法,因为新生代的对象寿命短暂且变化频繁,而老年代采用标记-清除或标记-整理算法,因为老年代的对象存活时间较长且对象数量较少。
总之,GC常用算法包括标记-清除算法、复制算法、标记-整理算法和分代算法。
每种算法都有其适用的场景和优缺点,选择合适的GC算法可以有效地管理和优化内存的使用。
jdk8gc机制

jdk8gc机制JDK 8的GC机制JDK 8(Java Development Kit 8)是Java平台的一个版本,其中包含了许多新的特性和改进。
其中一个重要的改进就是对垃圾回收(Garbage Collection,GC)机制的优化。
GC是Java内存管理的关键部分,它负责自动回收不再使用的对象,释放内存空间,以避免内存泄漏和程序崩溃。
在JDK 8中,GC机制经历了一些重大的改进和优化,以提高性能和减少内存占用。
下面将介绍一些JDK 8的GC机制的特点和优势。
1. G1垃圾回收器(Garbage First Garbage Collector):JDK 8引入了一种新的垃圾回收器,即G1垃圾回收器。
相比于之前的垃圾回收器,G1垃圾回收器具有更好的吞吐量和更低的延迟。
它能够自动监控各个内存区域的垃圾情况,并根据垃圾情况进行动态调整,以实现更高效的垃圾回收。
2. 基于Region的内存管理:JDK 8将堆内存分成了许多大小相等的区域(Region),每个区域独立管理。
这种基于Region的内存管理方式使得GC操作更加高效,可以更细粒度地管理内存,减少内存碎片。
同时,它还可以将GC操作分散到多个线程上,以提高并发性能。
3. 并行和并发回收:JDK 8的GC机制充分利用了多核处理器的并行能力。
它可以同时使用多个线程进行垃圾回收操作,以加快回收速度。
同时,它还引入了一些并发回收的策略,使得垃圾回收操作与应用程序的执行可以同时进行,减少了停顿时间,提高了用户体验。
4. 元空间代替永久代:JDK 8取消了永久代(PermGen)的概念,取而代之的是元空间(Metaspace)。
永久代是用于存储类的元数据信息的,而元空间则是使用本地内存(Native Memory)来存储类的元数据信息。
这种改变解决了永久代容易出现内存溢出的问题,提高了内存的利用率。
5. 垃圾回收日志和诊断工具:JDK 8提供了更丰富的垃圾回收日志和诊断工具,可以帮助开发人员更好地理解和分析程序的垃圾回收情况。
gc基本算法

GC(Garbage Collection)是一种自动内存管理机制,用于在程序运行时自动处理释放不再使用的内存。
GC 算法包括以下基本算法:
1. 引用计数算法(Reference Counting):该算法在对象被创建时初始化计数器为0,并在每个指向该对象的地方都将计数器加1。
当一个对象的计数器变为0 时,该对象就可以被回收。
这种算法简单易懂,但是会存在引用循环导致内存泄漏的问题。
2. 标记-清除算法(Mark-Sweep):该算法首先通过可达性分析标记所有从根节点(如主函数中定义的变量、全局变量、栈上的变量等)可以到达的对象,然后将未被标记的对象视为垃圾,进行回收。
该算法需要遍历整个内存空间,效率较低。
3. 复制算法(Copying):该算法将可用内存空间分成大小相等的两个区域,每次只使用其中一个空间。
当这个空间被占满时,就将未被占用的对象复制到另一个空间中,然后将该空间中所有对象都清除,交换两个空间的角色。
该算法有效地解决了空间碎片化的问题,但是需要开辟两倍的内存空间。
4. 标记-整理算法(Mark-Compact):该算法是将未被标记的对象视为垃圾,与标记-清除算法相同。
不同的是该算法在清除垃圾后,将所有存活对象向一端移动,然后清除另一端的所有内容。
该算法避免了内存碎片化的问题,但是需要遍历整个内存空间,效率较低。
gc工作原理

gc工作原理GC工作原理。
GC(垃圾回收)是指在计算机程序运行过程中,自动回收不再使用的内存空间,以便程序能够更高效地利用内存资源。
GC的工作原理是通过识别和回收不再使用的内存对象,从而释放内存空间,让程序能够继续运行。
GC工作原理的核心是通过扫描内存中的对象,识别哪些对象是不再被程序所引用的,然后将这些对象所占用的内存空间进行回收。
这个过程可以分为几个主要步骤,标记、清除和整理。
首先,GC会对内存中的对象进行标记,标记出哪些对象是被程序所引用的,哪些对象是不再被引用的。
这个过程可以通过遍历对象之间的引用关系来完成。
一旦标记完成,GC就能够知道哪些对象是可达的,哪些对象是不可达的。
接下来,GC会对不可达的对象进行清除,释放它们所占用的内存空间。
这个过程可以通过将不可达对象所占用的内存空间进行回收来完成。
这样一来,程序就能够继续运行,而不会因为内存空间不足而出现问题。
最后,GC可能会对内存空间进行整理,以便让程序能够更高效地利用内存资源。
这个过程可以通过将存活的对象向内存的一端移动,从而让内存空间变得更加连续,减少内存碎片的产生。
总的来说,GC的工作原理是通过识别和回收不再使用的内存对象,从而释放内存空间,让程序能够更高效地利用内存资源。
这个过程可以分为标记、清除和整理几个主要步骤,通过这些步骤,GC能够保证程序能够持续运行,并且不会因为内存空间不足而出现问题。
在实际的应用中,GC的工作原理对于程序的性能和稳定性都有着重要的影响。
因此,了解GC的工作原理,对于程序员来说是非常重要的。
只有深入理解GC的工作原理,才能够更好地优化程序的内存使用,从而提高程序的性能和稳定性。
总之,GC的工作原理是通过识别和回收不再使用的内存对象,从而释放内存空间,让程序能够更高效地利用内存资源。
通过标记、清除和整理几个主要步骤,GC能够保证程序能够持续运行,并且不会因为内存空间不足而出现问题。
深入理解GC的工作原理,对于程序员来说是非常重要的,可以帮助他们更好地优化程序的内存使用,提高程序的性能和稳定性。
gc常见算法

gc常见算法:一:引用计数法假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用消失时,对象A的引用计数器就-1,如果对象A 的计数器的值为0,就说明对象A没有引用了,可以被回收。
二:可达性分析算法该算法的基本思路就是通过一些被称为引用链(GC Roots)的对象作为起点,从这些节点开始向下搜索,搜索走过的路径被称为(Reference Chain),当一个对象到GC Roots没有任何引用链相连时(即从GC Roots节点到该节点不可达),则证明该对象是不可用的。
三:标记清除算法(老年代)标记-清除算法分为两个阶段,标记(mark)和清除(sweep).在标记阶段,GC从根对象开始进行遍历,对从根对象可以访问到的对象都打上一个标识,一般是在对象的header中,将其记录为可达对象。
而在清除阶段,GC对堆内存(heap memory)从头到尾进行线性的遍历,如果发现某个对象没有标记为可达对象-通过读取对象的header信息,则就将其回收。
四:标记整理算法(老年代)标记压缩算法是在标记清除算法的基础之上,做了优化改进的算法。
和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的清理未标记的对象,而是将存活的对象压缩到内存的一端,然后清理边界以外的垃圾,从而解决了碎片化的问题。
五:复制算法(新生代)复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。
如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要 (1)一、理解Java垃圾回收 (3)1.1基于的分代理论的垃圾回收 (3)1.2新生代的结构 (5)1.3老年代垃圾回收 (7)二、Java垃圾回收的监控 (11)2.1什么是GC监控 (11)2.2如何做GC监控 (11)2.3下章介绍 (23)三、GC 调优 (24)3.1GC调优是必须的吗 (24)3.2影响GC性能的选项 (25)3.3GC调优过程 (27)3.4监控GC状态并分析GC结果 (28)3.5设置GC类型和内存大小 (29)3.6分析GC调优结果 (31)3.7调优案例 (32)3.8总结 (36)四、Apache的MaxClients设置及其对Tomcat Full GC的影响 (37)4.1.MaxClients对系统的影响 (37)4.2.总结 (41)五、Java应用性能优化的原则 (42)5.1.概述 (42)5.2.Java性能优化必备的基础知识 (42)5.3.Java性能优化的流程 (43)5.4.JVM部署模型 (44)5.5.JVM体系结构 (45)5.6.JVM选项 (46)5.7.衡量应用的性能 (48)5.8.在关键点上做优化 (49)5.9.优化的途径 (49)摘自:https:///a/1190000004369048之---GC专家系列作者:牧曦之晨理解Java垃圾回收理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别。
所以,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响。
Java垃圾回收的监控Java垃圾回收的监控中介绍了在真实场景中JVM是如何运行GC,如何监控GC数据以及有哪些工具可用来方便进行GC监控。
GC 调优GC 调优中基于真实案例介绍了可用于GC调优的最佳选项。
同时也描述了如何通过降低移动到老年代中对象的数量来缩短Full GC耗时,以及如何设置GC类型及内存大小。
Apache的MaxClients设置及其对Tomcat Full GC的影响Apache的MaxClients设置及其对Tomcat Full GC的影响中介绍了Apache对MaxClients选项在系统发生GC时对整体性能的影响。
Java应用性能优化的原则Java应用性能优化的原则中介绍了Java应用性能优化的一般原则。
具体来说,我会介绍性能优化的必要条件、判断是否需要优化的步骤,同时也会列出在性能优化过程中经遇到的一些问题。
在文章结尾,我会给你一些在性能优化过程中如何做出最优决定的建议。
一、理解Java垃圾回收原文链接:/blog/dev-platform/understanding-java-garbage-collection/了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序。
上面是我个人的主观的看法,但我相信熟练掌握GC是成为优秀Java程序员的必备技能。
如果你对GC执行过程感兴趣,也许你只是有一定的开发应用的经验;如果你仔细考虑过如何选择合适的GC算法,说明你对你所开发的程序有了全面的了解。
当然这对一个优秀的程序员来说未必是一个通用的标准,但很少人会反对我关于"理解GC是作为优秀Java程序员的必备技能"的看法。
本文是成为Java GC专家系列的第一篇。
我将先对GC做一下基本的概述,在下一篇文章中,我将讲述如何分析GC状态以及通过[NHN]()的案例介绍GC调优相关的内容。
本文的目的是以通俗的方式为你介绍GC概念。
我希望本文会对你有所帮助。
事实上,我的同事们已经发表了一些在Twitter上非常受关注的优秀文章,你同样也可以拿来参考。
回到垃圾回收上,在开始学习GC之前你应该知道一个词:stop-the-world。
不管选择哪种GC算法,stop-the-world都是不可避免的。
Stop-the-world意味着从应用中停下来并进入到GC执行过程中去。
一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。
GC调优通常就是为了改善stop-the-world的时间。
1.1基于的分代理论的垃圾回收在Java程序里不需要显式的分配和释放内存。
有些人通过给对象赋值为null或调用System.gc()以期望显式的释放内存空间。
给对象设置null虽没什么用,但问题不会太大;如果调用了System.gc()却可能会为系统性能带来严重的波动,即便调用System.gc()系统也未必立即响应去执行垃圾回收。
(所幸的是,在NHN未曾看到有工程师这么做。
)在使用Java时,程序员不需要在程序代码中显式的释放内存空间,垃圾回收器会帮你找到不再需要的(垃圾)对象并把他们移出。
垃圾回收器的创建基于以下两个假设(也许称之为推论或前提更合适):∙大多数对象的很快就会变得不可达∙只有极少数情况会出现旧对象持有新对象的引用这两条假设被称为"弱分代假设"。
为了证明此假设,在HotSpot VM中物理内存空间被划分为两部分:新生代(young generate)和老年代(old generation)。
新生代:大部分的新创建对象分配在新生代。
因为大部分对象很快就会变得不可达,所以它们被分配在新生代,然后消失不再。
当对象从新生代移除时,我们称之为"minor GC"。
老年代:存活在新生代中但未变为不可达的对象会被复制到老年代。
一般来说老年代的内存空间比新生代大,所以在老年代GC发生的频率较新生代低一些。
当对象从老年代被移除时,我们称之为"major GC"(或者full GC)。
看一下下图的示意:图1:GC区域和数据流向图中的permanent generation称为方法区,其中存储着类和接口的元信息以及interned的字符串信息。
所以这一区域并不是为老年代中存活下来的对象所定义的持久区。
方法区中也会发生GC,这里的GC同样也被称为major GC。
有些人可能认为:如果老年代的对象需要持有新生代对象的引用怎么办?为了处理这种场景,在老年代中设计了"索引表(card table)",是一个512字节的数据块。
不管何时老年代需要持有新生代对象的引用时,都会记录到此表中。
当新生代中需要执行GC时,通过搜索此表决定新生代的对象是否为GC的目标对象,从而降低遍历所有老年代对象进行检查的代价。
该索引表使用写栅栏(write barrier)进行管理。
wite barrier是一个允许高性能执行minor GC的设备。
尽管它会引入一个数据位的开销,却能带来总体GC时间的大幅降低。
图2:索引表结构1.2新生代的结构为了深入理解GC,我们先从新生代开始学起。
所有的对象在初始创建时都会被分配在新生代中。
新生代又可分为三个部分:∙一个Eden区∙两个Survivor区在三个区域中有两个是Survivor区。
对象在三个区域中的存活过程如下:1.大多数新生对象都被分配在Eden区。
2.第一次GC过后Eden中还存活的对象被移到其中一个Survivor区。
3.再次GC过程中,Eden中还存活的对象会被移到之前已移入对象的Survivor区。
4.一旦该Survivor区域无空间可用时,还存活的对象会从当前Survivor区移到另一个空的Survivor区。
而当前Survivor区就会再次置为空状态。
5.经过数次在两个Survivor区域移动后还存活的对象最后会被移动到老年代。
如上所述,两个Survivor区域在任何时候必定有一个保持空白。
如果同时有数据存在于两个Survivor区或者两个区域的的使用量都是0,则意味着你的系统可能出现了运行错误。
下图向你展示了经过minor GC把数据迁移到老年代的过程:图3: GC前后在HotSpot VM中,使用了两项技术来实现更快的内存分配:"指针碰撞(bump-the-pointer)"和"TLABs(Thread-Local Allocation Buffers)"。
Bump-the-pointer技术会跟踪在Eden上新创建的对象。
由于新对象被分配在Eden空间的最上面,所以后续如果有新对象创建,只需要判断新创建对象的大小是否满足剩余的Eden空间。
如果新对象满足要求,则其会被分配到Eden空间,同样位于Eden的最上面。
所以当有新对象创建时,只需要判断此新对象的大小即可,因此具有更快的内存分配速度。
然而,在多线程环境下,将会有别样的状况。
为了满足多个线程在Eden空间上创建对象时的线程安全,不可避免的会引入锁,因此随着锁竞争的开销,创建对象的性能也大打折扣。
在HotSpot中正是通过TLABs解决了多线程问题。
TLABs允许每个线程在Eden上有自己的小片空间,线程只能访问其自己的TLAB区域,因此bump-the-pointer能通过TLAB在不加锁的情况下完成快速的内存分配。
本小节快速浏览了新生代上的GC知识。
上面讲的两项技术无需刻意记忆,只需要明白对象开始是创建在Eden区,然后经过在Survivor区域上的数次转移而存活下来的长寿对象最后会被移到老年代。
1.3老年代垃圾回收当老年代数据满时,便会执行老年代垃圾回收。
根据GC算法的不同其执行过程也会有所区别,所以当你了解了每种GC的特点后再来理解老年代的垃圾回收就会容易很多。
在JDK 7中,内置了5种GC类型:1.Serial GC2.Parallel GC3.Parallel Old GC(Parallel Compacting GC)4.Concurrent Mark & Sweep GC (or "CMS")5.Garbage First (G1) GC其中Serial GC务必不要在生产环境的服务器上使用,这种GC是为单核CPU上的桌面应用设计的。
使用Serial GC会明显的损耗应用的性能。
下面分别介绍每种GC的特性。
Serial GC(-XX:+UseSerialGC)在前面介绍的年轻代垃圾回收中使用了这种类型的GC。
在老年代,则使用了一种称之为"mark-sweep-compact"的算法。
1.首先该算法需要在老年代中标记出存活着的对象2.然后从前到后检查堆空间中存活的对象,并保持位置不变(把不再存活的对象清理出堆空间,称为空间清理)3.最后,把存活的对象移到堆空间的前面部分以保持已使用的堆空间的连续性,从而把堆空间分为两部分:有对象的和无对象的(称为空间压缩)Serial GC适用于CPU核数较少且使用的内存空间较小的场景。