1. 常见的垃圾回收算法
- 复制:将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。
- 标记清除(mark-sweep):收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。该算法遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。
- 标记整理(mark-sweep-compact):综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块。
2. 垃圾分代
年轻代
回收算法:复制
年老代
回收算法:标记整理
永久代
3. 其他
正确设置堆大小
避免堆失效:初始堆大小(-Xms)设成与最大堆大小(-Xmx)不相同,应用程序可能遇到这样的情况,不断出现分配失败而堆没有扩展。