jvm垃圾回收

1. 常见的垃圾回收算法

  • 复制:将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。
  • 标记清除(mark-sweep):收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。该算法遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。
  • 标记整理(mark-sweep-compact):综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块。

2. 垃圾分代

  年轻代

    回收算法:复制

  年老代

    回收算法:标记整理

  永久代

 

3. 其他

  正确设置堆大小

  避免堆失效:初始堆大小(-Xms)设成与最大堆大小(-Xmx)不相同,应用程序可能遇到这样的情况,不断出现分配失败而堆没有扩展。

posted @ 2014-04-03 16:05  EchoLee  阅读(130)  评论(0编辑  收藏  举报