(2)标记-复制算法
该算法解决了“标记-清除”算法效率低和大部分内存碎片问题,它将内存分为大小相等的两块,每次只使用其中一块,当其中一块需要回收时,只需将该块区域还存活的对象复制到另一块,然后再把该块内存一次性清理掉,循环往复 。
下图为标记-复制算法回收前和回收收简要示意图
文章插图
然而,由于年轻代大部分对象驻留时间都非常短,98%的对象都很快被回收,存活的对象非常少,不需要按照内存1:1来划分,而是按照8:1:1来划分,
将2%存活的对象放在s0(from区)即可 。
如下为按照Eden:s0:s1 =8:1:1 划分示意图
文章插图
(3)标记-整理算法
该算法分为两阶段,即标记和整理,首先标记所有存活对象,将这些对象向一端移动,然后直接清理掉端边界以外的内存 。由于老年代的对象存活时间比较长,因此适合用该算法 。
标记过程仍与“标记-清除”过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象向一端移动,然后直接清理掉端边界以外的内存 。
如下为"标记-整理算法"回收期和回收后示意图
文章插图
(4)分代收集算法
该算法为目前jvm算法,采用分代思想,模型如下:
文章插图
5.常见GC回收器有哪些?
(1)SerialGC
SerialGC又叫串行回收器,也是最基础的GC回收器,主要适用于单核cpu,新生代采用复制算法,老年代采用标记-压缩算法,在运行的过程中需要暂停应用程序,
因此会造成STW问题,在JVM标注参数为:-XX:+UseSerialGC。
(2)ParallelGC
ParallelGC基于SerialGC,主要解决SerialGC串行问题,改为并行问题,解决多线程问题,但同样会产生STW问题,jvm关键参数:
a.-XX:+UseParNewGC,表示新生代并行(复制算法) 老年代串行(标记-压缩)
b.XX:+UseParallelOldGC,老年代也是并行
(3)CMS GC
CMSGC属于老年代回收器,采用“标记-清除算法”,不会发生STW问题,在jvm中参数设置:
-XX:+UseConcMarkSweepGC,表示老年代使用CMS收集器
(4)Garbage First
Garbage First面向jvm垃圾收集器,它满足短时间停顿的同时达到一个高的吞吐量,适用于多核cpu和大内存的服务端,也是jdk9的默认垃圾回收器 。
五 总结深入分析了JVM内存模型,其中重点分析了jdk,jre和jvm关系,jvm类加载器,jvm堆内存划分,GC回收器和GC回收算法等,整体偏向于理论,由于篇幅有限,本篇文章未分析这些技术在JVM实际调优中是如何运用的,将在接下来的文章中与大家分享 。
推荐阅读
- 茶山揭秘系列之同庆河,中茶桐箐河同庆河享受稀缺的秘境野韵奇香
- 茶山揭秘系列之大安,古六大茶山古六大茶山系列之莽枝古树茶
- 茶山揭秘系列之曼夕,倚邦古茶山
- 太极初学者学习老架二路拳的意义
- 初学者练习太极必须要注意这五点
- 初学者力量训练计划有什么
- 初学者学的瑜伽注意什么?
- 初学者学哪种瑜伽比较好呢?
- 瑜伽初学者的动作怎么做呢?
- 初学者瘦身瑜伽要怎么做?