赞
踩
前言:我们在jvm调优时,主要目的就是让程序能够稳定的运行,减少卡顿,提升用户体验。而我们程序要都知道,在进行Full GC时,会造成STW(Stop The World)停止所有用户线程,造成卡顿。严重时会造成大量用户线程超时、失败等。调优就是根据不同场景,选择不同的垃圾收集器,并对其参数调整,来达到我们的目的,那么垃圾收集器有哪些,他的机制如何,我们又该如何选择和调优呢?
先来看看目前主流的垃圾收集器:
在说这些收集器的机制时,我们先了解一下分代理论和垃圾回收算法
现代大部分的虚拟机的垃圾回收器都遵循“分代收集”的理论基础来进行设计实现:
■ 绝大部分的对象的声明周期很短,都是朝生夕死。
■ 历经多次垃圾回收后仍然存活的对象就可能更加越难被回收。
根据这个理论基础,JVM的大部分虚拟机将堆空间逻辑划分为新生代/年轻代、老年代,垃圾收集器可以根据不同的区域选择不同的回收算法进行GC。
目前的算法有:标记-复制算法、标记-清除算法、标记-整理算法以及分代算法
如图所示:将内存分隔为两块相同大小的区域,每次只使用其中的一块,每当GC完成后,将存活的对象复制到另一块区域,然后将前一块清空。
如图所示:该算法分为标记和清除两个阶段,标记存活的对象,然后GC清除掉没有被标记的对象
这种算法虽然简单,但是有两个问题:
● 内存越大,要标记的对象越多,耗时越久,性能越低。
● 内存碎片化问题,导致大对象(数组)分配困难。
它的大体流程和标记清除法一致,但是它具有整理内存空间的功能。这种算法避免了内存碎片化的问题,但是效率上相对于标记-清除法略低。
根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用标记-复制算法,老年代采用标记整理算法。
接下来再说说不同的垃圾收集器:
Serial针对年轻代、Serial Old针对老年代,但是他俩有个特点就是单线程。流程很简单&#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。