# GCAlgorithms
## 目录
[1.Mark_Sweep: GC标记-清除法](#1mark_sweepgc标记-清除法)
- 标记阶段具体过程
- 清除阶段具体过程
- 分配
- 合并
- 优点
- 缺点
[2.GCCopying: GC复制算法](#2gccopying-gc复制算法)
- 复制算法具体过程
- 优点
- 缺点
[3.Mark_Compact:GC标记-压缩算法](#3mark_compactgc标记-压缩算法)
- 标记阶段
- 压缩节点
- 优点
- 缺点
[4.GenerationGC:分代垃圾回收](#4generationgc分代垃圾回收)
- 年龄
- 新生代对象与老年代对象
- 堆的分配
- 记录集
- 分配
- 新生代GC
- 老年代GC
- 优点
- 缺点
### 1.Mark_Sweep:GC标记-清除法
GC 标记 - 清除算法由标记阶段和清除阶段构成。标记阶段是把所有活动对象都做上标记的阶段。清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。
#### 标记阶段具体过程:
首先标记根直接引用的对象,然后递归标记通过指针数组能访问到的对象。为了避免重复标记,会在标记的对象obj头部进行一个标志位设置,通过obj.mark可以访问。如果obj.mark为真,则对象已经被标记过;如果obj.mark为假,则对象没有被标记。标记完所有活动对象,标记阶段就结束了。标记阶段所花费的时间 与活动对象的大小成正比。总结一下,标记阶段就是“遍历并标记”的过程。
#### 清除阶段具体过程:
清除阶段,我们使用一个叫sweeping的对象遍历堆,具体就是从堆的首地址开始,按顺序遍历对象的标志位,也就是我们前面在对象头设置的标志位mark。如果遍历到的对象mark为真,说明是活动对象,不进行回收,但我们会将对象的mark置为false,以便下一次的垃圾回收。为了将非活动对象进行回收,回收就是将对象进行分块,我们使用一个“空闲链表”将这些分块进行连接,之后分配对象只要遍历这个链表就可以找到分块。
那原来的非活动对象怎么处理呢?
在有新对象写入时就将原来的非活动对象进行覆盖了,因为是非活动对象,重写它的域也是没关系的。
#### 分配
分配就是指将垃圾回收再利用。在清除阶段,已经将垃圾对象连接到了空闲链表,搜索空闲链表并寻找大小合适的分块,这个过程就叫分配。
寻找分块又分为First-fit,Best-fit,Worst-fit。
First-fit就是遍历空闲链表找到第一个大于或等于要分配对象大小的分块,如果分块大小正好相当,返回这个分块;如果大于分块大小,将分割成和要分配对象大小的分块和剩下大小的分块,返回大小相等的分块,将剩余大小分块返回空闲链表。
Best-fit就是在空闲链表寻找大小最合适的分块,这意味着要遍历完整个空闲链表。
Worst-fit就是在空闲链表寻找最大的分块,同样要遍历完整个空闲链表。这个方法主要是想将分块切割后的大小最大化,但实际上会生成大量小的分块,不推荐。
综上,当使用单纯的空闲链表时,考虑分配所需的时间,使用First-fit最佳。
#### 合并
从上面可知,分配会产生大量小分块。但如果这些分块是连续的,可以将它们合并起来,变成大的分块。这个“连接连续分块”的过程就是合并。合并过程在清除阶段完成。
#### 优点
1. 实现简单。因为实现简单,所以与其他GC算法结合也相对容易。
2. 与保守式GC算法兼容。在保守式GC算法中,对象是不能移动的,因此保守式GC算法与其他移动对象的算法不兼容(如复制算法、标记-压缩算法),因为标记-清除算法并不会移动对象,所以与保守式GC算法兼容。
#### 缺点
1. 碎片化。由于分配的过程会产生大量小的分块,不久后就会导致无数小的分块散落在堆的各个地方。
2. 分配速度。因为分块是不连续的,每次都需要遍历链表,使用First-fit的话,最坏的情况是每次分配的过程都要遍历到最后一个分块。
3. 与写时复制技术不兼容。在Linux中使用fork()时,大部分内存空间都不会被复制,写时复制技术假装复制了内存空间,实际上是将内存共享。在对共享内存写入时,不能直接重写共享内存。因为其他程序访问时,就会发生数据不一致的情况。重写时,要先复制自己的私有空间,然后重写这个私有空间。复制后只访问这个私有空间,不访问共享内存。而标记-清除算法要重写共享内存,即使没有重写,也会设置标志位,导致频繁的复制。
***
### 2.GCCopying: GC复制算法
GC复制算法就是把某个空间里的活动对象复制到另一个空间里,将原空间的对象全部回收。进行复制对象的原空间叫做From空间,复制到的新空间称为To空间。当复制完成后,会将From空间和To空间互换,GC也就结束了。From空间和To空间的大小必须一致,这样才能保证对象的复制有足够空间。
#### 复制算法具体过程:
首先在To空间设置一个free指针,作为复制的起点。之后从根开始搜索,将搜索到的对象进行复制,递归复制其子对象。复制的过程中,检查对象的复制标志位copied,查看是否被复制过,如果copied为true,说明被复制过了,返回新空间对象的地址,这个地址在forwarding指针里;如果copied为false,说明没有被复制过,复制这个对象,然后将copied置为true,返回执行新空间对象的forwarding指针。使用标志位copied还有一个好处,就是如果有多个对象指向同一个对象,那么这个对象只会被复制一次。这里注意一下复制的顺序,是从根的直接引用对象开始复制,然后每复制一个直接引用对象,就将它的子对象进行复制。这样做的好处是有引用关系的对象物理位置相近。
不同于标记-清除算法,复制算法的分配过程比较简单。不需要遍历空闲链表,只需要从free指针开始,申请同样大小的内存空间,也不会造成碎片化。分配完成后,将free指针往后移动申请的内存大小。
#### 优点
1. 优秀的吞吐量。与标记-清除算法相比,复制算法只需要寻找活动对象和复制对象的时间,没有遍历空闲链表的时间,能在较短的时间内完成GC,吞吐量很高。
2. 可实现高速分配。因为分块一个连续的内存空间,只要这个分块大小不小于申请的空间大小,就可以直接分配,然后移动free指针,不需要把时间花在遍历链表上。
3. 不会碎片化。每次复制对象都将对象放在前一个对象后,没有碎片空间,这种行为也叫做**压缩**。
4. 与缓存兼容。复制后,有引用关系的对象相距较近,而大多数CPU都可以通过缓存读取位置较近的对象。
#### 缺点
1. 堆使用效率低下。因为我们将空间二等分,因此只有一一半的空间存放对象。
2. 不兼容保守式GC算法。前面说过保守式GC算法无法和移动对象的算法兼容。
***
### 3.Mark_Compact:GC标记-压缩算法
GC 标记 - 清除算法由标记阶段和压缩阶段构成。
#### 标记阶段
和标记-清除算法的一致,不再赘述。
#### 压缩阶段
压缩阶段具体由三个步骤构成:
1. 设定forwarding指针。用一个scan指针来搜索堆里的活动对象,当搜索到活动对象时,将活动对象的forwarding指针指向new_address,之后new_address根据对象的大小移动位置。
2. 更新指针。由于移动的对象可能会覆盖原来的对象,所以在移动前,需要将forwardin
没有合适的资源?快使用搜索试试~ 我知道了~
Java垃圾回收算法的简易模拟实现.zip
共9个文件
java:8个
md:1个
需积分: 5 0 下载量 119 浏览量
2024-01-14
09:40:00
上传
评论
收藏 13KB ZIP 举报
温馨提示
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了代码和底层硬件之间的中介。 面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
资源推荐
资源详情
资源评论
收起资源包目录
Java垃圾回收算法的简易模拟实现.zip (9个子文件)
SJT-code
src
com
lc
algorithms
GenerationalGC.java 6KB
Mark_Compact.java 2KB
Mark_Sweep.java 3KB
GCCopying.java 2KB
Exception
AllocationException.java 263B
model
GCRoots.java 870B
HeapObject.java 1024B
test
init.java 3KB
README.md 13KB
共 9 条
- 1
资源评论
JJJ69
- 粉丝: 6006
- 资源: 5613
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功