Docs/JVM/JVM垃圾回收.md
2022-10-18 16:59:37 +08:00

25 lines
No EOL
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 按照基本回收策略分
### 引用计数Reference Counting
原理是此对象有一个引用即增加一个计数删除一个引用则减少一个计数。垃圾回收时只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。
### 标记-清除Mark-Sweep
此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片
### 复制Copying
此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间
### 标记-整理Mark-Compact
此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题
## 按分区对待的方式分
### 增量收集Incremental Collecting
实时垃圾回收算法,即:在应用进行的同时进行垃圾回收。
### 分代收集Generational Collecting
基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代对不同生命周期的对象使用不同的算法上述方式中的一个进行回收。现在的垃圾回收器从J2SE1.2开始)都是使用此算法的。
## 按系统线程分
### 串行收集
串行收集使用单线程处理所有垃圾回收工作, 因为无需多线程交互实现容易而且效率比较高。但是其局限性也比较明显即无法使用多处理器的优势所以此收集适合单处理器机器。当然此收集器也可以用在小数据量100M左右情况下的多处理器机器上。
### 并行收集
并行收集使用多线程处理垃圾回收工作因而速度快效率高。而且理论上CPU数目越多越能体现出并行收集器的优势
### 并发收集
相对于串行收集和并行收集而言,前面两个在进行垃圾回收工作时,需要暂停整个运行环境,而只有垃圾回收程序在运行,因此,系统在垃圾回收时会有明显的暂停,而且暂停时间会因为堆越大而越长