当JVM自动垃圾回收成为JVM的瓶颈时,就需要进行合理的配置参数进行垃圾回收。
常用的垃圾回收的算法:引用计数法,根搜索算法。
引用计数法:到引用指向堆中创建的对象的时候,引用计数加1,取消指向的时候,引用技术减1。但是存在对象引用互相指向的情况,这样垃圾不能回收,即使对象没有引用指向,这是的引用计数器仍然是1.
根搜索算法: 当对象到GC Roots没有引用链相连,代表 这个对象可以被垃圾回收。
垃圾回收算法:标记清除法,复制算法,标记-整理算法,分代垃圾回收算法。
标记清除算法:标记出需要清除的对象,在标记完成之后统一清除掉这些对象。存在的问题:效率不是很高 容易在堆中产生碎片。
复制算法:在商业的虚拟机中,把堆中的内存分为Eden和两个Survivor,每次使用一个Eden和一个Survivor,当需要垃圾回收时,把Eden和Survivor中存活的对象复制到一个Survivor空间上,清理掉Eden和Survivor上的死亡了的对象。
标记-整理算法:将所有的存活的对象往一端移动,清理掉端之外的对象。
垃圾收集器:Serial收集器,ParNew收集器,Parallel Scavenge收集器 ,Serial Old收集器,Parallel Old收集器,CMS收集器,GI收集器
Serial收集器:单线程的收集器,简单而高效。
ParNew收集器:多线程的新生代垃圾收集器
Parallel Scavenge收集器:使用复制算法,多线程,新生代,可控吞吐量适合后台运算的垃圾收集器。
Serial Old收集器:使用标记-整理算法单线程的老年垃圾收集器。
Parallel Old收集器:使用标记-整理算法多线程的老年垃圾收集器。
CMS收集器:并发收集,低停顿的垃圾收集器,使用标记清除算法。具有标记整理算法的缺点。
GI收集器:基于标记整理算法,可以很好的控制停顿,对垃圾回收具有优先级别。
内存分配策略:对象 优先在 Eden上分配,大对象直接进入老年代,长期存活的对象进入老年代 ,动态年龄判定。