前言
最近被问到常用语言的GC原理,由于之前没有这么深入的探究,趁此机会做一个简单的总结。
至于为啥要了解GC,是因为了解了GC原理,你就会知道:
1. GC触发条件有两个,一个是内存不够了,一个是到时间了。
2. GC的过程是会损耗性能的,如何合理利用GC和优化内存呢?留个问题给你。
GC算法
引用计数法
顾名思义,给每一个内存块佩戴一个计数器,表示对象引用次数。当次数减为0即可被GC
标记-清除法
每次GC时,触发堆内存的遍历,把被引用内存做上标记,GC仅清除无标记的内存
缺点:GC时会STW。
复制算法
由于GC后会产生大量的内存碎片,因此GC是创建一块新的内存区域,将被引用内存块放入新内存区域,清除旧的内存区域,并使用新内存区域替代旧内存区域
缺点:内存复制时会占用更大内存空间。
标记-整理法
标记-清除法和复制算法的融合版本,简单讲就是在标记清除后,将剩余内存做一个整理。优点是不占用新的内存,缺点和标记-清除法一样。
分代收集算法
将内存分为新生代和老年代,GC仅清除老年代。
Erlang与Go的GC算法总结
Erlang的内存分为进程内自有内存和进程间共享内存。自有内存采用分代收集算法;共享内存采用引用计数算法。
Go的GC是标记-清除法的升级版本——三色标记法。将长时间的STW替换为短暂的STW。三色标记法标记内存时和用户行为并行运算。
其中各算法的详细原理,就不一一赘述了,相关技术文章很多。建议做简单了解,不必深究,当遇到问题时,可再找回来作为排查和解决问题的一个思路。
网友评论