Java中的垃圾回收算法主要有3种,分别是标记-清除算法、复制算法、标记-整理算法。
1.标记-清除算法
这种算法的逻辑其实很简单,就是先遍历一遍,把有用的东西都打个勾✅(标记),然后把那些没打勾的垃圾直接扔掉(清除)。
不过,这种算法存在一个缺点,就是会留下内存碎片。
2.复制算法
复制算法可以很好地解决内存碎片问题,这种算法是把内存一分为二,平时只用一半。
回收的时候,会把活着的对象全部复制到另一半去,然后把原来的那一半直接清空。
这种算法的优点是快,可以保证没有碎片,但是需轮流着一半的空间不能用,太浪费空间了。
3.标记-整理算法
标记-整理算法是老年代常用的算法。
对老年代的对象,因为存活的时间长,如果采用复制算法,需要复制一大堆,速度太慢;
但是,标记-清除又会产生碎片。
所以,标记-整理算法是先进行标记,然后把所有活着的对象往一端推,再把剩下的空间全部清空。
通过这种方式,既不会产生碎片,也不会浪费掉一半的空间,不过,把所有活着的对象往一端推这个整理的动作会比较耗时。