文章目录

  • 垃圾收集策略分类


JVM会自己选择合适的垃圾收集策略,而用户自己也可以自己来设置自己所需要的垃圾收集策略。不过就个人而言,强烈建议采用默认的垃圾收集处理机制。

垃圾的收集一定要分两个空间考虑:年轻代、老年代。因为老年代的内存空间要大于年轻代的内存空间,所以老年代每次执行GC都会消耗更多的时间。

垃圾收集策略分类


因为同一种垃圾收集策略,有可能会根据触发内存代的不同又不同的效果,所以先看各个内存策略的操作特点:

  • 年轻代-串行GC

  • 年轻代-并行回收GC

    同一个GC的处理操作,需要有多个线程共同完成,一个线程负责内存的扫描(扫描出不用的内存对象),而另一个线程负责对象的复制操作。

    大家看上图的左半边,是一个串行回收的过程。在回收的过程中在橙色部分做了一次停止,什么叫停止呢?

    比如我要进行空间的打扫,那我需要什么?大家先出去,我再来看那些有用那些没有用,不能所大家在这里边操作着,我还在这里做着打扫,要是你们吃着瓜子,吃一个扔一个,我就得你扔一个我扫一个,是不是性能太差了,是不是需要做一个中断,先出去再扫,扫完了垃圾你们再回来。

    继续看图的左边,在橙色部分有个叫“Stop-The-World pause”(STW可以简单理解为用于在垃圾回收时候进行的一个短暂的线程挂起,简称叫线程暂停)。

    再看右边的图,是并行回收过程。可以看到在并行的时候,暂停的时间会短些,这是由于有多个线程在共同做这件事。不过依然会有暂停。

  • 年轻代-并行GC

    注:
    CMS GC 是在整个设计过程中最为重要的一个环节,不过它本身也会有问题,因为老年代的空间一般较大,所以在扫描和标记存活对象上需要花费较长时间。
    并行回收只是处理年轻代的,而并行GC需要与老年代的 GC结合

  • 老年代-串行GC

    注:
    所有的串行GC处理都只是单线程处理,那么在进行处理的时候都必须暂停操作。

  • 老年代-并行GC

    操作步骤说明:
    将老年代内存空间按照线程个数分为若干个子区域
    如下图教室分工区域
    举个例子:今天有小郭和小岳要打扫教室,怎么打扫?是不是一人一半,他们两个谁也不吃亏的性格让一个人全做可能吗?不可能的,小郭在左边,小岳在右边。要是再来两个人一起打扫,就变成了4个人平分了。话说回来,上图是分配了4个线程4份区域。

    多个线程并行对多个各自负责子区域对象进行标记

    标记时候,操作已经暂停了,将有用的对象标记出来

    多个线程并行清楚所有未标记的对象

    没有用的对象,都扫扫扫,扫干净

    多个线程并行将多个存活对象整理在一起,并将所有被回收的对象空间整合为一体

    从操作步骤可以看出:与串行操作相比,整体的操作只是多了一个多线程的支持,但是这样的暂停时间就会减少。

  • 老年代-并行GC

    图中操作步骤:

    1. 初始标记(STW Initial Mark):虚拟机暂停正在执行的任务(STW),由根对象扫描出所有的关联对象,并做出标记。此过程只会导致短暂的JVM暂停
    2. 并发标记(Concurrent Marking):恢复所有暂停的线程对象,并且对之前标记过的对象进行扫描,取得所有跟标记对象有关联的对象;
    3. 并发预处理(Concurrent Preclearning):查找所有在并发标记阶段新进入老年代的对象(一些对象可能从新生代晋升到老年代,或者有一些对象被分配到老年代),通过重新扫描,减少下一阶段的工作;
    4. 重新标记(STW Remark):此阶段会暂停虚拟机,对在“并发标记”阶段被改变引用或新创建的对象进行标记;
    5. 并发清理(Concurrent Sweeping):恢复所有暂停的应用线程,对所有未标记的垃圾对象进行清理,并且会尽量将已回收对象的空间重新拼凑为一个整体。在此阶段收集器线程和应用程序线程并发执行;
    6. 并发重置(Concurrent Reset):重置CMS收集器的数据结构,等待下一次的垃圾回收
      操作步骤:
      操作步骤放大图:
      图中优缺点:

    只有在第一次和重新标记阶段才会暂停整个应用,这样对应用程序所带来的影响非常小。缺点是并发标记和回收线程会与应用线程争抢CPU资源,并容易产生内存碎片。

十、垃圾回收策略概览相关推荐

  1. JAVA之JVM分代垃圾回收策略(一)

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  2. ReviewForJob——java虚拟机的垃圾回收策略(个人总结)

    理解jvm的垃圾回收策略,需要解决以下3个问题 问题1:哪些内存需要回收? 问题2:什么时候进行回收? 问题3:怎样来回收? [解决问题1]哪些内存需要回收? jvm的内存区域有5大块: 1)程序计数 ...

  3. 垃圾回收策略和算法,看这篇就够了

    作者 | Craig无忌 来源 | 程序员大帝(ID:kingcoding) 前言 回收,旧手机,旧冰箱,旧空调,旧洗衣机,电瓶车摩托车,自行车,报纸,塑料...... 还记得小时候,我喝完的饮料瓶子 ...

  4. java垃圾回收 分代_Java分代垃圾回收策略原理详解

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  5. JVM分代垃圾回收策略的基础概念

    JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...

  6. jvm垃圾回收策略之标记清除

    垃圾回收指的是对 jvm堆内存的回收. 一. java虚拟机栈 二.本地方法栈(Native Method Stack) 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出Stac ...

  7. JS 垃圾回收机制以及垃圾回收策略

    垃圾回收机制 什么是垃圾回收机制: 解释:执行环境负责管理代码执行过程中使用的内存.JS的垃圾回收机制是为了以防内存泄漏,简单来说就是:间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存. ...

  8. 《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略

    文章目录 概述 对象已死吗 引用计数算法 可达性分析算法 再谈引用 finalize():生存还是死亡 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot ...

  9. Redis的超时命令和垃圾回收策略

    正如 Java 虚拟机,它提供了自动 GC(垃圾回收)的功能,来保证 Java 程序使用过且不再使用的 Java 对象及时的从内存中释放掉,从而保证内存空间可用. 当程序编写不当或考虑欠缺的时候(比如 ...

  10. java回收策略_Java 中的垃圾回收策略

    垃圾回收需要解决的问题 谁需要被回收 什么时候回收 怎么回收 谁需要被回收 如果一个对象再也不会被用到,就可以回收它了,所以关键在于如何知道一个对象再也不被使用了. 引用计数 当一个对象被引用时,引用 ...

最新文章

  1. python threading模块多线程源码示例(二)
  2. django搭建示例-ubantu环境
  3. python操作系统-Python实现获取操作系统版本信息方法
  4. Linux快速入门02-文件系统管理
  5. 牛客竞赛语法入门班数组字符串习题【完结】
  6. Binary XML file line #2: You must supply a layout_height attribute inflate
  7. java 斐波那契编程_Java实现Fibonacci(斐波那契)取余的示例代码
  8. 最新MyEclipseIDEAWebStorm安装 激活
  9. 打开旧Flutter项目说:Your Flutter application is created using an older version of the Android embedding
  10. java 中的随机数
  11. PAT1104 Sum of Number Segments精度问题
  12. codeforces 486 E. LIS of Sequence(dp)
  13. C语言符号优先级——(“++”符号的的坑)
  14. 如何提高计算机打字,如何练电脑打字速度,教你如何科学提高打字速度
  15. 一世人中,最黑仔嘅一日
  16. 采用计算机辅助数据收集,关于计算机在数据收集中的作用分析
  17. oracle官方网址
  18. 4G、5G多卡聚合技术在打造智慧城市中的解决方案
  19. 手机如何扫码连接wifi
  20. 计算机辅助造型软件,AutoCAD 2010 专业的大型计算机辅助设计软件

热门文章

  1. 开博第一篇:一个关于正则表达式相关的问题
  2. 线程基础阶段性总结和扩展(二)——ThreadLock
  3. 企业真实面试题总结(一)
  4. 数据结构之B树查找、插入、删除详解
  5. 并发编程学习之Lock同步锁
  6. leetcode 两数之和 java版本
  7. Jarvis Oj Pwn 学习笔记-level1
  8. 微信小程序不行了?连接应用场景面临挑战
  9. maven工程下管理module发布到SVN注意
  10. Qt公有槽和私有槽的区别