zoukankan      html  css  js  c++  java
  • 一篇文章让你了解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次,晋升到老年代

     

    老年代

       标记-清除、标记-整理

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

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

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

     

    常见的垃圾回收器

     

    1. 串行垃圾回收器(Serial Garbage Collector)
    2. 并行垃圾回收器(Parallel Garbage Collector)
    3. 并发标记扫描垃圾回收器(CMS Garbage Collector)
    4. G1垃圾回收器(G1 Garbage Collector)

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

     

    CMS - 并发的标记-清除

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

      初始标记(stw)

      只标记根对象

      并发标记

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

      重新标记(stw)

      并发清除

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

    总结:

      是一种以获得最短回收停顿时间为目标的收集器,基于标记清除算法。过程如下:初始标记,并发标记,重新标记,并发清除,

      优点是并发收集,低停顿,缺点是对CPU资源非常敏感,无法处理浮动垃圾,收集结束会产生大量空间碎片。

     

    G1 - Garbage First

       内存被划分成几千个内存块

       有伊甸园、生存区、老年代

       用复制算法

       G1会找到垃圾最多的内存块,优先回收

       配置参数非常简单,只需要配置目标停顿时间(stw)G1自动调整其他参数,来达到预期的停顿时间

    总结:G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的

       堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域

  • 相关阅读:
    Java study 1:The note of studying Socket which based UDP
    关于Meta标签中formatdetection属性及含义
    编辑sass报错:error style.scss (Line 3: Invalid GBK character "\xE5")解决办法
    比较三个 CSS 预处理器:Sass、LESS 和 Stylus(下)
    vue引入bootstrap、jquery
    Something about SeekingJobResume简历
    Something about SeekingJobTelInterview(电话面试)
    此时彼时
    The method getTextContent() is undefined for the type Node
    单例模式实现方式
  • 原文地址:https://www.cnblogs.com/lmqblogs/p/9986403.html
Copyright © 2011-2022 走看看