0
点赞
收藏
分享

微信扫一扫

gc的意义和触发条件


关于jvm的gc的必要性

jvm的堆内存不够时候,需要进行gc,释放内存

gc执行的条件

jvm的执行gc之前,必须停止所有线程,执行gc

gc的回收了什么对象

jvm使用可达性算法,回收未被引用的对象,引用计数法无法统计对象之间的应用。

gc时候,对象回收与否在对象是什么java的引用类型

  • 强引用(FinalReference) =》绝不会被回收
  • 软引用(SoftReference) =》内存泄露之前被回收
  • 弱引用(WeakReference) =》垃圾回收时候会被回收
  • 虚引用(PhantomReference)=》随时

gc的意义和触发条件_jvm

gc分类和执行环境

堆的结构的简单剖析

jvm1.8之前将堆内存分为 Eden,S0,S1,Old Meomory,Perm(1.8后被废除),每次新实例化的对象会放入 young gen,当Eden+s0区满了,进行minor gc,经过15次gc仍存在的对象升级到老年代(或者对象比较大,超过阈值也会直接放到老年代),当整个堆内存不够的时候,会对整个堆内存进行gc,这就是major gc。

gc的意义和触发条件_java_02

常用的gc算法的介绍

  • 标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,产生垃圾碎片。
  • 复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。
  • 标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
  • 分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法

gc收集器分类及优缺点

Gc收集器

使用的算法

作用的区域

特点

优点

缺点

Serial收集器

复制算法

新生代

标记和清理都是单线程

简单高效

必须暂停jvm,停顿时间长

Serial Old收集器

标记-整理

老年代

标记和清理都是单线程

简单高效

必须暂停jvm,停顿时间长

ParNew收集器

复制算法

新生代

并行

吞吐较好

必须暂停jvm,停顿时间长

ParallelScavenge收集器

复制算法

新生代

并行

精确控制gc时间

难以较好地控制gc的时间

Parold收集器

复制算法

老年代

并行

吞吐较好

必须暂停jvm,停顿时间长

CMS收集器

标记清除

老年代

并行

最短时间停顿

Gc的时间变长,无法处理浮动垃圾

G1收集器

标记整理

整个堆

并行

高效,无碎片产生,可指定gc停顿时间

G1需要额外的内存来记录数据分区

ZGC收集器

标记整理

整个堆

并行

高效低延时处理大内存的gc

产生浮动垃圾

浮动垃圾的定义:标记过程标记活着的对象,从GCRoot的可达性判断对象活着,但无法标记“死亡”的对象。 如果在初始标记阶段被标记为活着,并发运行过程中“死亡”,remark过程无法纠正,因此变为浮动垃圾,需等待下次gc的到来


举报

相关推荐

0 条评论