垃圾收集算法

一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓!”算法吧~

一:引言

程序=算法+数据结构,在业界,这个著名的公式大家应该人人都知道,由此可见,算法的重要性和地位举足轻重!

那么算法是如何定义的呢? 算法是一系列解决问题或完成特定任务的详细步骤。在计算机科学中,算法是一种明确、可复制的过程,用于接收一组值或量(作为输入),并产生一组值或量(作为输出)。

二:常见算法介绍

作为程序员,经常会接触到各种类型的常见的算法,很多很多,比如排序算法,查找算法、图论算法和字符串算法等等。但是令人最深刻的,特别是Java程序员,当然是垃圾收集算法了。一般,垃圾收集算法按照发展演变史,分为以下几大类型:

引用计数算法(Reference Counting):比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

复制算法(copy):将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A
优点:遍历对象成本小,由于只遍历活跃对象
缺点:复制成本高,需要较多的内存

标记清除算法(mark-sweep):收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。
优点:不用复制
缺点:遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。

标记整理算法(mark-sweep-compact) 这个算法有3个阶段,mark(标识回收对象),sweep(清除),compact(压缩)。 综合前两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块
分代算法( Generations )
 分代根据对象的生命周期长短,把堆分为3个代:
Young(年轻代、新生代)

Old(年老代、老生代)

Permanent(永生代)

优点:根据不同代的特点采用不同的收集算法,扬长避短

三:重点算法总结

如果说JVM是Java的核心,那么垃圾收集算法就是JVM的核心。

因此,掌握垃圾收集算法意义非常重大。了解算法的特性,你就能知道如何在不同的场景下使用不同的收集算法,比如高吞吐场景和密集计算场景。并且知道如何进行参数调优,达到预期效果。

对于算法岗的程序员而言,不但要掌握好常用的算法,还有一些特殊领域的算法需要掌握(例如自动驾驶领域,人工智能领域等等)。而且需要有独立设计和开发新算法的能力。

对于开发岗的程序员而言,则要求没有那么高,掌握常见的算法足已。例如一些安全算法,加解密算法等等。如因工作需要,还要掌握数学公式算法,转换算法等等。

总算所述,程序员要提高自己的编程开发水平,练好算法是“内功”,必须多多实践和总结,算法是一件比较烧脑的事情,但是它能使程序员有质的提升!加油!

你可能感兴趣的:(算法和数据结构,算法,jvm,java)