目录:
1.垃圾回收机制简介。
Java的内存分配与回收由JVM自动完成,垃圾回收能自动释放内存空间,程序员不需要在代码中显示地启动垃圾回收。System.gc()和Runtime.gc()用来请求JVM启动垃圾回收。这个请求机制只是提供给程序员一个启动 GC 的机会,具体是否启动还是由 JVM负责。
原理: 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
2.如何确定对象是否需要回收?
垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用,Java中,通过引用和对象进行关联,操作对象,必须通过引用来进行,若一个对象没有引用相关联,就可以回收了。
3.典型的垃圾收集算法。
a.Mark-Sweep(标记-清除)算法
最基础的垃圾回收算法,两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。
缺点:造成内存碎片
b.Copying(复制)算法
解决Mark-Sweep算法的缺陷(内存碎片),将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,再把已使用的内存空间一次清理掉。但对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。
c.Mark-Compact(标记-整理)算法
解决Copying算法的缺陷,充分利用内存空间。标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。
d.Generational Collection(分代收集)算法
目前大部分JVM的垃圾收集器采用的算法。核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收。
4.典型的垃圾收集器有哪些?
a.Serial收集器
b.ParNew收集器
c.Parallel Old收集器
d.Parallel Scavenge收集器
e.CMS收集器
g.G1收集器
原文:https://www.cnblogs.com/smilexuezi/p/11568840.html