一篇文章让你了解GC垃圾回收器

简单了解GC垃圾回收

了解GC之前我们首先要了解GC是要做什么的?顾名思义回收垃圾,什么是垃圾呢?

GC回收的垃圾主要指的是回收堆内存中的垃圾对象。

从根对象出发,所有被引用的对象,都是存活对象 其他对象,都是垃圾对象。

 根对象:

   栈中的引用变量,所引用的对象。

   方法区经静态变量所引用的对象。

 GC回收的三种基本方式

一、标记-清除

  标记存活对象,清理其他垃圾对象(阴影为存活对象,空白为垃圾对象)

  优点:效率高

  缺点:产生碎片,使内存分布碎片化,造成内存空间不连续。若出现大的对象,内存空间不连续则难以存取

 

一篇文章让你了解GC垃圾回收器

二、标记-整理

  标记存活对象,清除垃圾对象,对垃圾对象进行整理 

  优点:没有碎片

   缺点:效率低

一篇文章让你了解GC垃圾回收器

三、复制

  在内存中分配两块内存,将标记的存活对象复制到另一块内存当中,

  再将原内存的对象清除。

  优点:效率高

  缺点:浪费内存

一篇文章让你了解GC垃圾回收器

 内存分区

   新生代

   老年代

   永久代(方法区)(在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代)

 

新生代

  主要是用来存放新生的对象。一般占据堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收

 

 新生代又分为伊甸园与生存区,生存区分为ServivorFrom、ServivorTo

Eden区(伊甸园):Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。

ServivorTo:保留了一次MinorGC过程中的幸存者。

ServivorFrom:上一次GC的幸存者,作为这一次GC的被扫描者。

 

过程:

 新建对象,在伊甸园分配内存

 伊甸园存满,复制到from

 from存满,复制到to,并交换角色

 对象在fromto之间复制15次,晋升到老年代

 

一篇文章让你了解GC垃圾回收器

老年代

   标记-清除、标记-整理

   间隔一段时间,会执行一次小范围垃圾回收

   当老年代空间占用到一定比例 0.85,会执行full-gc

   当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

 

常见的垃圾回收器

 

串行垃圾回收器(Serial Garbage Collector)

并行垃圾回收器(Parallel Garbage Collector)

并发标记扫描垃圾回收器(CMS Garbage Collector)

G1垃圾回收器(G1 Garbage Collector)

了解主要的两种(CMS,G1)

 

CMS - 并发的标记-清除

  STW(Stop The World)时间非常短暂

  初始标记(stw)

  只标记根对象

  并发标记

  垃圾回收器,与其他java程序并行执行

  重新标记(stw)

  并发清除

  与其他java程序并行执行,配置参数过多,使用过于复杂

总结:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjdpj.html