java虚拟机垃圾收集算法介绍


今天介绍下java虚拟机内的垃圾收集算法

分代收集理论

  • 分代假设:
    • 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的
    • 强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡
  • 在Java堆划分出不同的区域之后,垃圾收集器才可以每次只回收其中某一个或者某些部分的区域——因而才有了“Minor GC”“Major GC”“Full GC”这样的回收类型的划分

标记-清除算法

  • 算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象

标记-复制算法

  • 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉
  • 如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制的开销,但对于多数对象都是可回收的情况,算法需要复制的就是占少数的存活对象,而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑有空间碎片的复杂情况,只要移动堆顶指针,按顺序分配即可
  • 缺陷显而易见,空间浪费严重
  • Appel式回收的具体做法是把新生代分为一块较大的Eden(通常80%)空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor

标记-整理算法

  • 标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存

文章作者: Xudong Jiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Xudong Jiang !
 上一篇
java-多线程-线程安全简单介绍 java-多线程-线程安全简单介绍
本文对多线程的线程安全做一个简单介绍和探讨。 在特定场景下,多线程是一把利刃,可以帮助我们提升业务处理的性能,充分利用服务器的性能,甚至在某些情况下会让编程从逻辑上更简单清晰。 但是他同时是一把双刃剑,我们早就习惯了艳丽的玫瑰总是带刺的
2018-07-22
下一篇 
git常用命令 git常用命令
今天介绍下版本管理工具:git的一些常用命令 git介绍 Git是目前世界上最先进的分布式版本控制系统 可以有效、高速地处理从很小到非常大的项目版本管理 git原理(参考 ) 暂存操作会对先每一个文件计算校验和checksum(Git 使
2018-05-13
  目录