垃圾收集器与内存分配策略

合集下载

java虚拟机的工作原理

java虚拟机的工作原理

java虚拟机的工作原理Java虚拟机(JVM)是Java程序运行的环境,它负责解释和执行Java字节码。

JVM的工作原理可以分为三个主要的部分:类加载、字节码执行和垃圾回收。

1.类加载:JVM通过类加载器将Java字节码加载到内存中。

类加载器根据类路径在文件系统或网络中查找并读取字节码文件,然后将其转化为JVM运行时数据结构,如类和方法的元数据。

加载完成后,JVM会在方法区中存储类的元数据,并在堆中分配内存来存储类的实例。

2.字节码执行:3.垃圾回收:JVM提供垃圾回收机制来自动释放不再使用的内存。

JVM会跟踪每个对象的引用,当一个对象没有引用时,即被视为垃圾。

垃圾回收器定期执行垃圾收集操作,释放垃圾对象占用的内存。

垃圾回收器有不同的实现策略,如标记-清除、引用计数、复制、标记-整理等。

除了以上三个主要的部分,JVM还包含其他组件,如堆内存、栈、方法区等。

堆内存用于存储对象实例,栈用于存储局部变量和方法调用参数,方法区用于存储类的元数据和静态数据。

JVM的工作过程如下:1. 通过类加载器加载Java字节码。

2.解释执行或JIT编译字节码。

3.根据需要进行垃圾回收和内存管理。

4.执行程序。

JVM的优点是跨平台性、自动内存管理和高性能。

通过JVM,Java程序可以在不同的硬件和操作系统上运行,无需修改源代码。

JVM的自动内存管理功能减轻了开发人员对内存管理的负担,避免了内存泄漏和越界访问等错误。

JVM的即时编译技术能够将热点代码优化为本地机器代码,提高程序的执行效率。

在实际的Java应用开发中,了解JVM的工作原理有助于编写高效的代码和解决性能问题。

开发人员可以通过调整JVM参数、选择合适的垃圾回收器和内存分配策略来优化程序的性能。

同时,了解JVM的工作原理还有助于理解虚拟机层面的问题和调优技巧,提升应用的可靠性和稳定性。

zgc收集器原理

zgc收集器原理

zgc收集器原理ZGC收集器原理ZGC(Z Garbage Collector)是一款由Oracle开发的垃圾收集器,它是针对大内存、低延迟场景下的一种创新性垃圾收集器。

ZGC收集器的设计目标是在不超过10ms的停顿时间内,能够处理几个TB 内存的堆。

一、并发处理ZGC采用了并发处理的方式来减少停顿时间。

它通过将垃圾收集的不同阶段与应用程序的执行相并发,以最大程度地减少停顿时间对应用程序的影响。

具体而言,ZGC采用了以下并发处理策略:1. 并发标记ZGC通过使用读屏障和写屏障来保证并发标记的准确性。

它首先从根对象开始,通过遍历对象图的方式标记所有存活的对象。

并且,ZGC在标记阶段中不会暂停应用程序的执行,从而保证了垃圾收集的并发性。

2. 并发清除在并发标记的过程中,ZGC会记录下所有需要被回收的对象,并在标记阶段结束后进行并发清除。

在并发清除阶段中,ZGC会将未被标记的对象回收,并将回收的内存空间进行重利用。

二、分代式处理ZGC将堆内存分为不同的代(Generation),并对不同代采用不同的垃圾收集算法。

这样一来,ZGC可以更加高效地管理堆内存,并减少垃圾收集的开销。

1. 年轻代ZGC将年轻代分为多个Region,并采用了并发的标记-复制算法。

在年轻代的垃圾收集过程中,ZGC会将存活的对象复制到一块新的内存空间中,并且在复制的过程中与应用程序的执行并发进行。

2. 老年代ZGC对老年代的垃圾收集采用了并发压缩算法。

在老年代的垃圾收集过程中,ZGC会将未被回收的对象进行压缩,从而减少内存的碎片化,并提高堆内存的利用率。

三、引用处理ZGC对引用的处理也非常重要。

它通过使用读屏障和写屏障来保证引用的正确性,并且在并发标记的过程中对引用进行跟踪和更新。

通过精确的引用处理,ZGC可以准确地判断对象的存活状态,避免误判和错误回收。

四、内存分配ZGC对内存分配也进行了优化。

它采用了本地线程缓冲区(Thread-Local Allocation Buffer,TLAB)的方式来提高内存分配的效率。

g1内存分配机制

g1内存分配机制

G1(Garbage-First)是Java HotSpot虚拟机中一种新的垃圾收集器。

其内存分配机制主要特点如下:
G1将堆内存划分为多个独立的块,这些块可以是一致性非活区(Eden),也可以是存活对象区(Survivor)或者是老年代(Old)。

G1使用一种称为“混合收集”的策略,这种策略能够同时进行年轻代和老年代的收集,以尽可能地减少垃圾收集停顿的时间。

G1首先关注垃圾最多的区域,也就是优先回收垃圾最多的Survivor和老年代区域。

这样可以最大化地减少垃圾收集的停顿时间。

G1在运行时会对各个区域进行扫描,并计算出每个区域垃圾的多少,以便于优先回收垃圾最多的区域。

在使用G1垃圾收集器时,建议开启JVM参数:-XX:+UseG1GC和-XX:MaxGCPauseMillis=N来设置最大GC停顿时间为N毫秒,以优化垃圾收集性能。

优化代码的内存占用与回收策略

优化代码的内存占用与回收策略

优化代码的内存占用与回收策略在编程中,优化代码的内存占用和回收策略是一项非常重要的任务。

通过减少程序的内存占用和及时释放不再使用的内存,可以提高程序的性能和效率。

下面将介绍一些优化代码内存占用和回收策略的方法。

1.使用合适的数据结构和算法:选择合适的数据结构和算法可以减少内存占用。

例如,使用数组而不是列表可以减少内存碎片,使用哈希表可以加快查找速度。

2.避免频繁的内存分配和释放:频繁的内存分配和释放会导致内存碎片,降低内存利用率。

可以使用对象池或缓存来重用已分配的对象,减少内存分配的次数。

3.及时释放不再使用的内存:当对象不再使用时,应及时将其释放,以便垃圾收集器可以回收这些内存。

如果使用了大量的内存,可以考虑使用手动内存管理,例如通过调用析构函数或手动释放内存。

4.使用合适的垃圾回收算法:不同的编程语言和环境提供了不同的垃圾回收算法,例如标记-清除算法、引用计数算法等。

选择合适的垃圾回收算法可以提高内存回收的效率。

5.避免内存泄漏:内存泄漏是指程序中存在一些不再使用的内存对象,但由于没有释放它们,导致内存占用持续增加。

可以使用工具来检测和修复内存泄漏问题,例如内存泄漏检测工具和代码审查。

6.使用内存分析工具:使用内存分析工具可以帮助定位内存占用较高的代码和对象,并进行相应的优化。

这些工具可以提供可视化的内存使用情况,查看对象之间的引用关系等。

7.压缩内存占用:可以通过一些技术来压缩内存占用,例如使用位图来代替布尔数组、使用压缩算法来压缩数据等。

这些方法可以减少内存的使用,同时保持数据的正确性。

8.缓存数据:对于一些频繁使用的数据,可以考虑使用缓存来提高访问速度。

将数据缓存在内存中可以减少磁盘访问次数,提高程序的性能。

9.限制内存使用:对于一些较大的对象或数据集,可以限制其内存使用。

例如,可以将数据分块处理,每次只加载部分数据到内存中。

10.性能测试和优化:进行性能测试可以帮助发现代码中的性能瓶颈和内存占用问题。

操作系统中的内存回收与垃圾回收机制

操作系统中的内存回收与垃圾回收机制

操作系统中的内存回收与垃圾回收机制随着计算机技术的发展,操作系统日趋复杂,内存管理成为了一个重要的课题。

内存回收和垃圾回收机制是操作系统中解决内存管理问题的两个重要手段。

本文将介绍操作系统中的内存回收与垃圾回收机制的基本原理和实现方式。

一、内存回收的概念及原理在操作系统中,内存回收是指对不再被程序使用的内存空间进行回收,以便于再次分配给需要内存的程序。

内存回收的主要原理是通过内存分配时的记录机制来判断内存是否还在使用中,从而判断是否需要回收。

操作系统中的内存管理通常采用两种方式进行内存回收:显式回收和隐式回收。

显式回收是指通过程序员手动释放不再使用的内存空间。

这种方式需要程序员明确地调用内存回收函数或方法来释放内存。

显式回收的优点是可以精确控制内存回收的时机,但同时也需要程序员具备对内存的管理能力,否则容易出现内存泄漏等问题。

隐式回收是指通过操作系统自动检测和回收不再使用的内存空间。

操作系统会在程序执行过程中根据一定的算法和策略来判断内存是否需要回收。

隐式回收的优点是无需程序员关注内存管理的细节,但也有可能导致系统的性能下降,因为系统需要额外的开销来进行内存回收。

二、垃圾回收机制的概念及原理垃圾回收机制是一种更高级的内存回收方式,它通过自动检测和回收程序不再使用的内存空间来解决内存管理的问题。

垃圾回收机制可以从根对象(如全局变量、活动函数等)出发,遍历整个内存空间,将无法访问到的对象标记为垃圾,并回收这些垃圾对象所占用的内存空间。

垃圾回收机制的基本原理是通过引用计数和可达性分析两种方式来确定对象是否是垃圾。

引用计数是指为每个对象维护一个计数器,记录当前对象被引用的次数。

当计数器为0时,表示该对象不再被使用,可以被回收。

可达性分析是指通过遍历对象之间的引用关系,判断对象是否能够被根对象(如全局变量)访问到。

如果对象无法通过任何引用路径与根对象相连,则该对象被认定为垃圾。

三、内存回收和垃圾回收机制的实现方式1. 内存回收的实现方式内存回收的实现方式多种多样,常见的有:(1)标记回收算法:通过标记内存中存活对象和未存活对象的方式来实现回收。

达到gc的技巧

达到gc的技巧

达到gc的技巧
(1)构建垃圾收集策略
垃圾收集器的效率是极其重要的,对于极其复杂的应用程序,它能够在极短的时间内有效地解决内存回收问题。

根据不同的垃圾回收策略,可以编写出最有效的内存回收代码。

(2)减少对象创建
理想情况下,能够减少无用对象的创建,减少垃圾对象,这样可以减少搜索和回收的时间,提高效率。

(3)使用对象的手动回收
程序员应该通过编写代码,有意地释放无用对象,避免用合适的时候不释放无用对象。

这样可以提高系统内存的有效使用,增加gc时回收对象的数量,进而减少回收时间。

(4)使用小而紧密的数据结构
结构越小,搜索和回收的时间越慢,对系统性能的影响越小。

与此同时,使用小而紧密的数据结构,也有助于以最小的成本实现最大的效果。

(5)使用静态字段来表示不变的实例
如果某些实例的值不会改变,则可以使用静态字段来表示这些实例,因为静态字段是不可变的,只在类初始化的时候分配一次,不会被gc收集。

(6)减少内存分配
在系统运行过程中,尽量减少内存分配,尽量使用存在的内
存,这样可以减少gc时间,提高性能。

(7)使用内存池
内存池能够有效地避免频繁分配大量小内存,减少gc次数,减少开销。

(8)使用可复用的对象
应用程序如果频繁地创建不同的实例,就会耗费系统资源,所以应该尽量在应用程序中使用可复用的实例,避免重复创建。

G1详解——精选推荐

G1详解——精选推荐

G1详解⼀ G1收集器g1收集器是⼀个⾯向服务端的垃圾收集器适⽤于多核处理器、⼤内存容量的服务端系统。

它满⾜短时间gc停顿的同时达到⼀个较⾼的吞吐量。

JDK7以上版本适⽤先介绍两个概念:吞吐量和响应能⼒,响应能⼒和吞吐量是评价⼀个系统的两个重要指标吞吐量吞吐量关注的是,在⼀个指定的时间内,最⼤化⼀个应⽤的⼯作量。

如下⽅式来衡量⼀个系统吞吐量的好坏:在⼀定时间内同⼀个事务(或者任务、请求)完成的次数(tps)数据库⼀定时间以完成多少次查询对于关注吞吐量的系统,⼀定次数卡顿(即stw)是可以接受的,因为这个系统关注长时间的⼤量任务的执⾏能⼒,单次快速的响应并不值得考虑响应能⼒响应能⼒指⼀个程序或者系统对请求是否能够及时响应,⽐如:⼀个桌⾯UI能多快地响应⼀个事件⼀个⽹站能够多快返回⼀个页⾯请求数据库能够多快返回查询的数据对于这类对响应能⼒敏感的场景,长时间的停顿是⽆法接受的,关注每⼀次反应的能⼒。

1.1 G1收集器的设计⽬标与应⽤线程同时⼯作,⼏乎不需要 stop the work(与CMS类似);G1的设计规划是要替换掉CMS,G1在某些⽅⾯弥补了CMS的不⾜,⽐如CMS使⽤的是mark-sweep算法,⾃然会产⽣内存碎⽚(CMS只能在Full GC时,⽤ stop the world整理内存碎⽚),然⽽G1基于copying算法,⾼效的整理剩余内存,⽽不需要管理内存碎⽚GC停顿更加可控,甚⾄可以设置⼀个时间阈值,⽐如说可以回收某些部分的⽼年代,⽽不像CMS⽼年代必须全部回收(其它收集器时间可能难以把握)1.2 G1重要概念1.2.1 分区( Region)G1采取了不同的策略来解决并⾏、串⾏和CMS收集器的碎⽚、暂停时间不可控等问题—G1将整个堆分成相同⼤⼩的分区或称为区域( Region)G1的堆结构如下:每个分区都可能是年轻代也可能是⽼年代,但是在同⼀时刻只能属于某个代。

年轻代,survivor区,⽼年代这些概念还存在,成为逻辑上的概念,这样⽅便复⽤之前分代框架的逻辑。

垃圾回收器的工作原理

垃圾回收器的工作原理

垃圾回收器的工作原理
垃圾回收器的工作原理是通过自动检测和清除程序中不再使用的内存对象来实现内存管理。

它的主要工作包括以下几个步骤:
1. 标记:垃圾回收器首先会从根对象(如全局变量、活动栈等)开始,遍历程序对象的引用链,将可达的对象标记为“存活”。

2. 清除:清除阶段会遍历整个堆内存,将未被标记为“存活”的对象当作垃圾,将其所占用的内存空间释放出来。

3. 压缩:清除阶段可能会留下大量不连续的内存空间碎片。

为了解决这个问题,垃圾回收器会进行内存压缩操作,将存活对象紧凑地排列在一起,使得内存空间得到整理。

4. 再分配:经过压缩后,垃圾回收器会记录下可用的内存空间,并将这些空间划分为一系列更小的块,以备后续的对象分配使用。

垃圾回收器的工作原理基于以下几个基本假设:
1. 引用可达性:只有可达的对象才被认为是“存活”的,垃圾回收器通过根对象遍历引用链,确定哪些对象是可达的。

2. 内存分配速度小于回收速度:保证在未来的内存分配中,总是能够有足够的内存空间供分配对象使用。

3. 垃圾对象不再被引用:垃圾回收器需要保证在清除阶段,所有未被标记的对象都不再被引用,以免误删存活对象。

垃圾回收器可以通过不同的算法实现,例如标记-清除、标记-
整理、复制、分代等。

每种算法都有其特定的优缺点和适用场景,但它们的基本原理都是相似的。

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

垃圾收集器与内存分配策略一、如何判断对象是否还在存活1.引用计数法:主流的Java虚拟机没有使用这种方法管理内存,因为它很难解决循环依赖2.可达性分析:通过一系列的称为”GC Roots“的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有与任何引用链相连时,则证明该对象是不可用的。

作为GC Roots的对象包括以下几种:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象以及本地方法栈中JNI引用的对象。

二、引用:•定义:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。

•分类:强引用:代码之中普遍存在的,如Object obj = new Object(), 只要强引用还在,GC就永远不会回收该内容。

软引用:描述有用但非必须的对象。

对于软引用关联着的对象,在系统将要抛出内存异常之前,会将这些对象列进回收范围进行二次回收。

如果这次回收还没有足够的内存,才会抛出异常。

(SoftReference)弱引用:弱引用也用来描述非必须的对象。

被若引用关联的对象只能活到下次垃圾回收发生之前。

当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

虚引用:又称为幽灵引用或者幻影引用。

一个对象是否有虚引用的存在,丝毫不会影响对象的生存时间,也不能通过虚引用获得对象实例。

为一个对象设置虚引用关联的唯一目的就是能在这个对象被垃圾收集器回收时收到一个系统通知。

三、对象标记之后就会回收吗•可达性分析之后,没有在任何GC Roots引用链上的对象,就会被第一次标记,标记之后还有一次筛选的过程;•筛选的条件是:此对象是否有必要执行finalize方法,有必要执行的条件是:该对象覆盖了finalize方法,并且没有虚拟机调用过,也就是说任何一个对象的finalize方法都只会被系统执行一次。

•如果有必要执行finalize方法,该对象则将会被放置一个成为F_Queue的队列之中,并在稍后由一个有虚拟机自动建立的、低优先级的Finalizer线程去触发该方法。

但不会等待finalize执行结束。

•finalize方法是对象逃脱死亡命运的最后一次机会。

稍后GC将对F_Queue中的对象进行第二次小规模的标记,如果能与引用链上任何一个对象建立关系,对象就不会被再次标记,从而活下来。

•注:如果没有必要执行finalize对象,是不是就会立即被GC 回收呢四、方法区的回收•在堆中,尤其是新生代中,常规应用进行一次垃圾收集一般可以回收70%~95%的空间,而永久代的垃圾收集效率远低于此。

•永久代中的垃圾收集主要回收两部分内容:废弃常量和无用的类•废弃常量:当前系统中没有任何一个对象引用该常量。

•无用的类:该类所有的实例都已被回收(Java堆中不存在该类的任何实例)、加载该类的ClassLoader被回收、该类对应的ng.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

五、垃圾收集算法•1、标记-清除算法:首先是标记出所有需要回收的对象,在标记完成后回收所有被标记的对象。

缺点:•效率问题:标记和清楚两个过程的效率都不高•空间问题:标记清除之后会造成大量不连续的内存碎片,空间碎片太多导致需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作。

2、复制算法:描述:将可用内存按容量划分为两块,每次只是用其中的一块,当这一块内存用完了,就将还存活的对象复制到另外一块内存,然后再把已使用过的内存空间一次性的清理掉。

优点:不用考虑内存碎片缺点:内存缩小为原来的一半应用:目前的商业虚拟机都采用这种收集算法来回收新生代,具体如下:将内存分为一块较大的Eden空间和两块较小的Survivior空间,每次使用Eden和其中一个Survivior空间。

当回收时,将Eden区和Survivior中还存活着的对象一次性的复制到另外一块Survivior空间上,最后清理Eden区和另一块Survivior区。

Hotspot 虚拟机默认Eden和Survivior的大小比例是8:1当另外一块Survivior空间没有足够的空间存放上一次新生代存活的对象时,这些对象将直接通过分配担保机制进入老年代。

3、标记-整理算法:标记之后,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

4、分代收集算法:当前虚拟机的垃圾收集都采用”分代收集“算法。

一般是把Java堆分为新生代和老年代;新生代:每次垃圾收集时都会有大批对象死去,只有少量存活,该区域采用复制算法。

老年代:对象存活率较高,而且没有额外空间对她进行分配担保,就必须使用”标记-清理“或者”标记-整理“算法进行回收。

六、HotSpot 的算法1、枚举根节点:GC停顿:可达性分析要确保在一个一致性的快照中进行,确保分析过程中引用关系不再变化。

GC进行时,必须停顿所有的Java执行线程。

Stop the World 如何枚举根节点:GC Roots主要在全局性的引用,如常量、类静态属性,与执行上下文中,如果逐个检查,必然消耗大量的时间。

使用OopMap:HotSpot使用一组OopMap来记录对象的引用,加快GC Roots的枚举。

2、安全点:背景:如果每个指令都生成对应的OopMap,那会需要大量的额外空间,这样GC的成本将会变得非常高。

解决办法:只在特定位置记录对象的引用情况,这些特点的位置我们称之为安全点。

安全点的选定条件:是否具有让程序长时间执行的指令(原因)如何保证GC时,让所有线程都跑到最近的安全点上再停顿下来:•抢先式中断:GC发生时,首先把所有的线程全部中断,如果发现有线程中断的地方不在安全点上,就恢复线程,让他”跑“到安全点上。

现在几乎没有虚拟机采用这种方式来暂停线程以响应GC事件•主动式中断:GC需要中断线程的时候,不直接对线程操作,而是简单的设置一个标志,而是在执行到安全点时轮训该标志,如果标志为真就自己中断挂起。

3、安全区域:背景:安全点机制保证了程序执行时,在不太长时间就会遇到可进入GC的安全点,如果程序没有执行呢,比如出于sleep或者blocked状态,这时候线程无法响应jvm的中断请求,Jvm也显然不太可能等待线程被重新分配CPU时间。

安全区域:在一段代码之中,引用关系不会发生变化,在这个区域中任意地方开始GC都是安全的实现:当线程执行到安全区域后,首先会标示自己进入了安全区域,那样,当在这段时间内发生GC时,就不用管这样的线程了,当线程要离开该区域时,要检查系统是否已经完成了根节点枚举,如果没完成,它就必须等待直到收到可以安全离开安全区域的信号。

七,垃圾收集器目前新生代垃圾收集器有Serial,ParNew,Parallel Scavenge;老年代收集器有CMS,Serial Old,Parallel Old;G1这款垃圾收集器既能用于新生代又能用于老年代。

1,Serial收集器:描述:单线程收集器;他进行垃圾收集时,必须暂停所有的工作线程,直到它收集结束;新生代采取复制算法暂停所有用户线程,老年代采取标记-整理算法暂停所有用户线程。

现状:目前为止,依然是虚拟机运行在Client模式下的默认新生代收集器。

收集几十兆甚至一两百兆的新生代,停顿时间完全可以控制在几十毫秒最多一百毫秒以内。

2,ParNew收集器:描述:其实就是Serial的多线程版本;使用多线程进行垃圾收集;新生代采取复制算法暂停所有用户线程,老年代采用标记-整理算法暂停所有用户线程。

现状:许多运行在Server模式下的虚拟机默认的新生代收集器;一个与性能无关的原因是:除了Serial收集器外,目前只有它能与CMS收集器配合使用。

注:•ParNew收集器是使用-XX:+UseConcMarkSweepGC选项后的默认新生代收集器;也可以使用-XX:UseParNewGC指定它•可以使用-XX:+ParallelGCThreads参数限制垃圾收集的线程数3,Parallel Scavenge收集器:描述:Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。

所谓吞吐量就是cpu用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)参数:最大垃圾收集停顿时间设置:-XX:MaxGCPauseMillis,设置值是一个大于0的毫秒数,收集器将尽可能地保证内存回收花费的时间不超过设定值。

GC停顿时间的缩短是以牺牲吞吐量和新生代空间来换取的,可能会把新生代调小一些,以使在规定的时间内可以完成垃圾回收;也可能为了减小停顿时间而增大GC频率。

-XX:+GCTimeRatio:设置一个大于0且小于100的整数值,也就是垃圾收集时间占总时间的比率,如果设置成x,GC时间的占比就是1/(1+x)-XX:+UseAdaptiveSizePolicy:这是一个开关参数,打开这个参数后,不需要手工指定新生代大小,Eden和Survior区的比例,晋升老年代对象年龄等细节参数。

虚拟机会根据当前系统的运行情况动态调整这些参数以提供最合适的停顿时间或者最大吞吐量。

与ParNew收集器的区别:可以设置吞吐量和最大停顿时间;具有自适应调节策略。

4,Serial Old收集器:描述:Serial Old是Serial收集器的老年代版本,单线程收集器,使用“标记-整理”算法。

5,Parallel Old收集器:描述:Parallel Scavenge收集器的老年代版本;吞吐量优先的收集器6,CMS收集器:Concurrent Mark Sweep描述:以获取最短回收停顿时间为目标;基于“标记-清除”算法步骤:•初始标记:标记GC Roots能直接关联到的对象,速度很快;该阶段需要stop the world•并发标记:进行GC Roots trace,并发进行•重新标记:修正并发期间因为用户程序继续运行而导致变动的那一部分对象的标记记录。

•并发清除:缺点:•CMS收集器对CPU资源非常敏感,它虽然不会导致用户线程停顿,但是由于占用了一部分cpu时间而导致应用变慢,总吞吐量会降低。

•CMS收集器无法处理浮动垃圾,可能出现Concurrent Mode Failure失败,导致另一次full gc的产生。

并发清理过程中,用户线程生成的垃圾不能被本次回收所清理,只能等到下次GC时清理,这部分垃圾称为“浮动垃圾”;每次垃圾清理时,都要为用户线程的运行留出内存空间,所以不能等到没有空间时才回收。

如果CMS运行期间预留的内存空间无法满足程序需要,就会出出现一次“Concurrent Mode Failure”失败,这时虚拟机将启动后背预案:临时使用Serial Old收集器重新进行老年代的垃圾收集;使用-XX:CMSInitiatingOccupancyFraction设置阈值•CMS是基于“标记-清理”算法实现的收集器,意味着收集结束时会产生大量的空间碎片。

相关文档
最新文档