Java垃圾收集算法初步了解
GC算法,也就是Garbage Collected,垃圾回收算法。
- 标记-清除算法
- 复制算法
- 标记-整理算法
- 分代收集算法
标记-清除算法
基础的垃圾回收算法,后面几个算法都是在这个基础上进行的改进。
就是进行最简单的,先对所有要回收的对象进行==标记==,标记完成之后直接统一==回收==。
问题:
- 效率问题
- 空间问题(太多碎片)
复制算法
这种方法是对标记-清除算法的改进,为了==改进其效率问题==
将内存分为两块,保持其中一块的空白。每次操作,比如新建对象什么的,只是其中的一块内存。
然后在进行垃圾回收时,首先还是对要回收的对象进行标记。但是将剩余的仍然存活的对象,复制到另一块内存中并进行整理。
然后在这块内存用完之后,将其中仍然存活的对象复制到另一块内存内,然后将用完的这一整块内存直接全部回收。
标记-整理算法
针对老年代特点(每次都有很多对象幸存)。
仍然是先进行标记,与标记-清除算法一样。
然后不是直接回收已标记内存,而是让所有存活对象向前移动,然后将边界以外的内存全部清除掉。
分代收集算法
没有啥新思想,只是根据不同的内存区域,也就是不同的“代”来采用不同的垃圾回收算法。
现在JVM都是用分代收集算法。
一般分为新生代和老年代。
- 新生代:==每次收集都有大量对象死去==;所以说复制幸存的对象的成本低,可以采用复制算法
- 老年代:==对象存活几率较高==;没有多余的内存空间可以使用,所以说采用标记-清除算法或者是标记-整理算法。