导航:首页 > 源码编译 > jvmgc算法

jvmgc算法

发布时间:2025-03-16 08:28:30

❶ JVM 技术详解:常见的 GC 算法(Parallel/CMS/G1)

学习了 GC 算法的相关概念之后,我们将介绍在 JVM 中这些算法的具体实现。首先要记住的是,大多数 JVM 都需要使用两种不同的 GC 算法——一种用来清理年轻代,另一种用来清理老年代。厅行

我们可以选择 JVM 内置的各种算法。如果不通过参数明确指定垃圾收集算法,则会使用相应 JDK 版本的默认实现。本章会详细介绍各种算法的实现原理。

串行 GC 对年轻代使用 mark-(标记—复制)算法,对老年代使用 mark-sweep-compact(标记—清除—整理)算法。

两者都是单线程的垃圾收集器,不能进行并行处理,所以都枣型会触发全线暂停(STW),停止所有的应用线程。

因此这种 GC 算法不能充分利用多核 CPU。不管有多少 CPU 内核,JVM 在垃圾收集时都只能使用单个核心。

要启用此款收集器,只需要指定一个 JVM 启动参数即可,同时对年轻代和老年代生效:

该选项只适合几百 MB 堆内存的 JVM,而且是单核 CPU 时比较有用。

对于服务器端来说,因为一般是多个 CPU 内核,并不推荐使用,除非确实需要限制 JVM 所使用的资源。大多数服务器端应用部署在多核平台上,选择 串行 GC 就意味着人为地限制了系统资源的使用,会导致资源闲置,多余的 CPU 资源也不能用增加业务处理凳伏猜的吞吐量。

关于串行垃圾收集器的日志内容,我们在后面的内容《GC 日志解读与分析》之中进行详细的讲解。

并行垃圾收集器这一类组合,在年轻代使用“标记—复制(mark-)算法”,在老年代使用“标记—清除—整理(mark-sweep-compact)算法”。年轻代和老年代的垃圾回收都会触发 STW 事件,暂停所有的应用线程来执行垃圾收集。两者在执行“标记和复制/整理”阶段时都使用多个线程,因此得名“ Parallel ”。通过并行执行,使得 GC 时间大幅减少。

通过命令行参数 -XX:ParallelGCThreads=NNN 来指定 GC 线程数,其默认值为 CPU 核心数。可以通过下面的任意一组命令行参数来指定并行 GC:

并行垃圾收集器适用于多核服务器,主要目标是增加吞吐量。因为对系统资源的有效使用,能达到更高的吞吐量:

❷ GC的复制算法和标记整理算法

复制算法
复制算法是将内存划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中的一个区间(称为活动区间),而另外一个区间(空闲区间)是空闲的。
当有效内存空间耗尽时,JVM将暂停程序运行,开启复制GC线程。接下来GC线程会将活动区的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。
此时,空闲区间已经与活动区间交换,而垃圾对象现在已经全部留在了原来的活动区间,也就是现在的空闲区间。事实上,在活动区间转换为空闲区间的同时,垃圾对象已经被一次性全部回收了。

开始时:

在被GC线程处理后:

可以看到,1和4号对象被清楚了,而2,3,5,6号对象则是规则的排列在刚才的空闲区间,也就是现在的活动区间之间,此时左半部分已经变成空闲区间,然而,如中在下一次GC之后,左半部分再次变成活动区间。
显然:
复制算法缺点时非常明显的:
1.直接浪费了一般的内存。
2.再就是加入对象存活率非常高,达到了极端的100%,那么我们需要将所有的对象都复制一遍,并将所有引用地址重置一遍。复制这一工作所花费的时间,在对象存活率达到一定的程度时,将会变得不可忽视。
由此可见,复制算法要想使用,最起码对象的存活率要非常低才行,而且最重要的是,我们态悔必须要克服50%内存浪费。

标记整理算法

分为两个阶段:
1.标记:遍历GC roots,然后将存活的对象标记。
2.整理:移动所帆橡正有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收,这个阶段才为整理阶段。

它与GC 前后与复制算法类似,只不过没有了活动区间和空闲区间

倘若此时GC线程开始工作,那么紧接着开始的就是标记阶段了。此阶段与标记/清除算法的标记阶段是一样一样的,我们看标记阶段过后对象的状态,如下图。

接下来,便应该是整理阶段了。我们来看当整理阶段处理完以后,内存的布局是如何的,如下图。

❸ JVM的垃圾算法有哪几种

一、垃圾收集器概述

如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。

JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用

二、各个垃圾收集器说明

1、Serial(年轻代)

阅读全文

与jvmgc算法相关的资料

热点内容
游戏源码搭建一条龙 浏览:192
宋金pdf 浏览:807
服务器为什么需要内存池 浏览:526
php与jquery开发实例 浏览:289
编程大世界故事漫画 浏览:983
北漂程序员出车祸 浏览:914
亚马逊为什么用云端服务器 浏览:65
程序员审核职位 浏览:385
德龙空调压缩机 浏览:780
红旗app如何注册新账户 浏览:360
惯导pdf 浏览:606
c程序员的平均工资 浏览:58
微小店源码 浏览:801
编译原理答题题库 浏览:169
ubuntu编程入门 浏览:301
antbuild命令 浏览:771
怎么订阅服务器 浏览:593
视频专用加密器哪个好用 浏览:295
app无法使用网络哪里设置 浏览:847
红旗linux怎么安装 浏览:136