垃圾回收-GC

三个问题
  哪些内存需要回收?
  什么时候回收?
  如何回收?

YoungGC和FullGC:

  新生代引发的GC叫YoungGC
  老年代引发的GC叫FullGC

 FullGC会引起整个Jvm的用户线程暂停,待垃圾回收完毕后,才继续运行

引用的定义:
如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表一个引用

对象存活状态:

确定对象“存活”还是“死去”:以下两种算法原理都一样,就是看当前这个对象,是否有引用正在指向它,如果有,就是还有用的,如果没有,就清除

  第一种:引用计数算法(已被废弃):

    如果当前对象有一个引用正在指向它,则在其对应的计数器上+1,统计完后计数器上为0的就代表没用的对象,进行清除

  第二种:根搜索算法(GC Roots):

    先找到对象,再根据对象去搜索,看有没有引用正指向它,如果有,就是还有用的,如果没有,就清除

永久代的垃圾回收:

永久代回收“性价比”比较低,因为里面放的都是静态的对象,都是有用的,无法回收,就算触发了一次回收,占用内存还是不会变
主要回收
  废弃的常量
  无用的类
    类的所有实例都已经被回收
    加载该类的ClassLoader已经被回收
    该类的Class对象没有在任何地方被引用

   
堆垃圾回收算法:

1、标记-清除算法

以两种状态个所有对象分类,然后清除掉可回收的部分

特点:
  分为“标记”和“清除”两个阶段
  标记完成后,统一回收
缺点:
  效率,标记和清除过程效率都不高
  空间,标记清除后会产生大量不连续的内存碎片

2、复制算法

把内存分为ab两块,触发垃圾回收的时候,直接把a里面可用的对象有序的复制到b里面,并清空a(和新生代的原理一样)

特点:
  内存分为相等的两块
  当一块内存用完,将存活对象复制到另外一块中,原内存一次性清理掉
  复制时按照顺序分配内存,无内存碎片问题
  新生代使用此算法
缺点:
  将内存分为两半,利用率低

3、标记-压缩算法

根据标记清除算法改良而来

特点:
  先对存活对象进行标记
  让所有存活对象向一边移动
  清理掉存活对象边界外的所有内存

注:老年代使用此算法

4、分代收集算法

当代的商业虚拟机都采用“分代收集”
根据对象的存活周期的不同将内存划分成几块,一般Java堆分为新生代和老年代
新生代采用复制算法
老年代采用标记-压缩算法

垃圾收集器

以上的所有算法,都只是理念,而垃圾收集器是内存回收算法的具体实现,没有完美的收集器

Jvm不同的区域可以采用不同的垃圾收集器组合,主要有:
1、Serial收集器(串行)

  单线程收集器
  用户线程全部停止(Stop the world)
  Client模式下,新生代默认收集器
  优点:简单、高效

2、ParNew收集器(并行)

  并行收集器,Serial收集器的多线程版本
  Server模式下Jvm默认的新生代收集器
  默认开启的垃圾回收线程与cpu核数一致

3、CMS收集器(并发)

并发收集器(ConcurrentMarkSweep)
采用了标记-清除算法
并发收集、低停顿
缺点:
  消耗cpu
  会产生内存碎片
  浮动垃圾(Concurrent Mode Failure

4、G1收集器

性能测试三十五:jvm垃圾回收-GC的更多相关文章

  1. JVM垃圾回收——GC

    一.JVM内存分配与回收 下图为堆内存结构图(注意:元数据区(MetaData )实际上不属于堆): 1.对象优先在Eden区分配 大多数情况下,对象在新生代中Eden区分配.当Eden区没有足够空间 ...

  2. JVM垃圾回收(GC)流程

    /* 首先介绍一下JVM中堆内存的组成: JVM堆内存主要由三部分组成: (1)新生代: 伊甸园区,存活区,伸缩区 (2)老年代: 老年区,伸缩区 (3)元空间(永久代): 元空间,伸缩区 注意:JD ...

  3. JVM 垃圾回收GC Roots Tracing

    1.跟搜索算法: JVM中对内存进行回收时,需要判断对象是否仍在使用中,可以通过GC Roots Tracing辨别. 定义: 通过一系列名为”GCRoots”的对象作为起始点,从这个节点向下搜索,搜 ...

  4. Java虚拟机(三):JVM垃圾回收机制

    概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方 ...

  5. JVM垃圾回收GC

    1.堆的分代和区域 (年轻代)Young Generation(eden.s0.s1  space)    Minor GC (老年代)Old Generation (Tenured space)   ...

  6. JVM—垃圾回收GC算法

    1 GC算法简介 算法 特点 标记-清除 分为"标记"和"清除"两个阶段 复制 可以解决效率问题,将可用的内存按容量划分为大小相等的两块. 标记-整理 先标记. ...

  7. JVM学习(三)JVM垃圾回收

    一.引用的分类 在了解JVM垃圾回收机制之前,了解一下对象的引用类型是非常必要的. 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收 弱引用:描述有用但不是必须 ...

  8. JVM学习——垃圾回收GC(学习过程)

    JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...

  9. 修改Tomcat的jvm的垃圾回收GC方式为CMS

    修改Tomcat的jvm的垃圾回收GC方式 cp $TOMCAT_HOME/bin/catalina.sh $TOMCAT_HOME/bin/catalina.sh.bak_20170815 vi $ ...

随机推荐

  1. 设计模式---对象创建模式之原型模式(prototype)

    一:概念 原型模式(Prototype Pattern) 实际上就是动态抽取当前对象运行时的状态 Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例.使用Protot ...

  2. vue中extend/component/mixins/extends的区别

    vue中extend/component/mixins/extends的区别 教你写一个vue toast弹窗组件 Vue.extend构造器的延伸

  3. vuex2.0源码分析

    当我们用vue在开发的过程中,经常会遇到以下问题 多个vue组件共享状态 Vue组件间的通讯 在项目不复杂的时候,我们会利用全局事件bus的方式解决,但随着复杂度的提升,用这种方式将会使得代码难以维护 ...

  4. PHP7 学习笔记(八)JetBrains PhpStorm 2017.1 x64 MySQL数据库管理工具的使用

    填写基本信息 这时候我们可以看到已经连接成功的数据库了 打开一个表,我们可以很清楚的看到数据库表的数据 切换到DDL模式

  5. 神级程序员通过两句话带你完全掌握Python最难知识点——元类!

    千万不要被所谓"元类是99%的python程序员不会用到的特性"这类的说辞吓住.因为 每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生 ...

  6. C#实现虚拟控件列表显示100w个控件方法

    方法一: C#的FlowlayoutPanel添加一定数据量的控件后就会空白,通过虚拟列表方式可以解决这个问题. 1.创建一个包含ScrollPanel和滚动条的用户控件,定义一个List,添加控件时 ...

  7. VS Sln图标空白修复办法

    环境:Win10,VS2017,曾经安装并卸载过VS2015之前安装了两个版本的VisualStudio,卸载一个后,就出现了图标空白问题,重新设置默认打开程序也没有作用,经摸索解决办法如下.(1)在 ...

  8. [PageNofM]一直显示数字+0

    解决办法: Options->ReportOptions->DoublePass勾选即可

  9. u-boot移植(七)---代码修改---存储控制器

    一.CPU访问芯片的条件 CPU通过访问存储控制器,来读取外部设备的数据. CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率 其他芯片相关的特 ...

  10. luogu 4158 粉刷匠 dp套dp

    dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...