十、垃圾回收策略概览
文章目录
- 垃圾收集策略分类
JVM会自己选择合适的垃圾收集策略,而用户自己也可以自己来设置自己所需要的垃圾收集策略。不过就个人而言,强烈建议采用默认的垃圾收集处理机制。
垃圾的收集一定要分两个空间考虑:年轻代、老年代。因为老年代的内存空间要大于年轻代的内存空间,所以老年代每次执行GC都会消耗更多的时间。
垃圾收集策略分类
因为同一种垃圾收集策略,有可能会根据触发内存代的不同又不同的效果,所以先看各个内存策略的操作特点:
年轻代-串行GC
年轻代-并行回收GC
同一个GC的处理操作,需要有多个线程共同完成,一个线程负责内存的扫描(扫描出不用的内存对象),而另一个线程负责对象的复制操作。
大家看上图的左半边,是一个串行回收的过程。在回收的过程中在橙色部分做了一次停止,什么叫停止呢?比如我要进行空间的打扫,那我需要什么?大家先出去,我再来看那些有用那些没有用,不能所大家在这里边操作着,我还在这里做着打扫,要是你们吃着瓜子,吃一个扔一个,我就得你扔一个我扫一个,是不是性能太差了,是不是需要做一个中断,先出去再扫,扫完了垃圾你们再回来。
继续看图的左边,在橙色部分有个叫“Stop-The-World pause”(STW可以简单理解为用于在垃圾回收时候进行的一个短暂的线程挂起,简称叫线程暂停)。
再看右边的图,是并行回收过程。可以看到在并行的时候,暂停的时间会短些,这是由于有多个线程在共同做这件事。不过依然会有暂停。
年轻代-并行GC
注:
CMS GC 是在整个设计过程中最为重要的一个环节,不过它本身也会有问题,因为老年代的空间一般较大,所以在扫描和标记存活对象上需要花费较长时间。
并行回收只是处理年轻代的,而并行GC需要与老年代的 GC结合老年代-串行GC
注:
所有的串行GC处理都只是单线程处理,那么在进行处理的时候都必须暂停操作。老年代-并行GC
操作步骤说明:
将老年代内存空间按照线程个数分为若干个子区域
如下图教室分工区域
举个例子:今天有小郭和小岳要打扫教室,怎么打扫?是不是一人一半,他们两个谁也不吃亏的性格让一个人全做可能吗?不可能的,小郭在左边,小岳在右边。要是再来两个人一起打扫,就变成了4个人平分了。话说回来,上图是分配了4个线程4份区域。多个线程并行对多个各自负责子区域对象进行标记
标记时候,操作已经暂停了,将有用的对象标记出来
多个线程并行清楚所有未标记的对象
没有用的对象,都扫扫扫,扫干净
多个线程并行将多个存活对象整理在一起,并将所有被回收的对象空间整合为一体
从操作步骤可以看出:与串行操作相比,整体的操作只是多了一个多线程的支持,但是这样的暂停时间就会减少。
老年代-并行GC
图中操作步骤:- 初始标记(STW Initial Mark):虚拟机暂停正在执行的任务(STW),由根对象扫描出所有的关联对象,并做出标记。此过程只会导致短暂的JVM暂停
- 并发标记(Concurrent Marking):恢复所有暂停的线程对象,并且对之前标记过的对象进行扫描,取得所有跟标记对象有关联的对象;
- 并发预处理(Concurrent Preclearning):查找所有在并发标记阶段新进入老年代的对象(一些对象可能从新生代晋升到老年代,或者有一些对象被分配到老年代),通过重新扫描,减少下一阶段的工作;
- 重新标记(STW Remark):此阶段会暂停虚拟机,对在“并发标记”阶段被改变引用或新创建的对象进行标记;
- 并发清理(Concurrent Sweeping):恢复所有暂停的应用线程,对所有未标记的垃圾对象进行清理,并且会尽量将已回收对象的空间重新拼凑为一个整体。在此阶段收集器线程和应用程序线程并发执行;
- 并发重置(Concurrent Reset):重置CMS收集器的数据结构,等待下一次的垃圾回收
操作步骤:
操作步骤放大图:
图中优缺点:
只有在第一次和重新标记阶段才会暂停整个应用,这样对应用程序所带来的影响非常小。缺点是并发标记和回收线程会与应用线程争抢CPU资源,并容易产生内存碎片。
十、垃圾回收策略概览相关推荐
- JAVA之JVM分代垃圾回收策略(一)
一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...
- ReviewForJob——java虚拟机的垃圾回收策略(个人总结)
理解jvm的垃圾回收策略,需要解决以下3个问题 问题1:哪些内存需要回收? 问题2:什么时候进行回收? 问题3:怎样来回收? [解决问题1]哪些内存需要回收? jvm的内存区域有5大块: 1)程序计数 ...
- 垃圾回收策略和算法,看这篇就够了
作者 | Craig无忌 来源 | 程序员大帝(ID:kingcoding) 前言 回收,旧手机,旧冰箱,旧空调,旧洗衣机,电瓶车摩托车,自行车,报纸,塑料...... 还记得小时候,我喝完的饮料瓶子 ...
- java垃圾回收 分代_Java分代垃圾回收策略原理详解
一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...
- JVM分代垃圾回收策略的基础概念
JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...
- jvm垃圾回收策略之标记清除
垃圾回收指的是对 jvm堆内存的回收. 一. java虚拟机栈 二.本地方法栈(Native Method Stack) 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出Stac ...
- JS 垃圾回收机制以及垃圾回收策略
垃圾回收机制 什么是垃圾回收机制: 解释:执行环境负责管理代码执行过程中使用的内存.JS的垃圾回收机制是为了以防内存泄漏,简单来说就是:间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存. ...
- 《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略
文章目录 概述 对象已死吗 引用计数算法 可达性分析算法 再谈引用 finalize():生存还是死亡 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot ...
- Redis的超时命令和垃圾回收策略
正如 Java 虚拟机,它提供了自动 GC(垃圾回收)的功能,来保证 Java 程序使用过且不再使用的 Java 对象及时的从内存中释放掉,从而保证内存空间可用. 当程序编写不当或考虑欠缺的时候(比如 ...
- java回收策略_Java 中的垃圾回收策略
垃圾回收需要解决的问题 谁需要被回收 什么时候回收 怎么回收 谁需要被回收 如果一个对象再也不会被用到,就可以回收它了,所以关键在于如何知道一个对象再也不被使用了. 引用计数 当一个对象被引用时,引用 ...
最新文章
- python threading模块多线程源码示例(二)
- django搭建示例-ubantu环境
- python操作系统-Python实现获取操作系统版本信息方法
- Linux快速入门02-文件系统管理
- 牛客竞赛语法入门班数组字符串习题【完结】
- Binary XML file line #2: You must supply a layout_height attribute inflate
- java 斐波那契编程_Java实现Fibonacci(斐波那契)取余的示例代码
- 最新MyEclipseIDEAWebStorm安装 激活
- 打开旧Flutter项目说:Your Flutter application is created using an older version of the Android embedding
- java 中的随机数
- PAT1104 Sum of Number Segments精度问题
- codeforces 486 E. LIS of Sequence(dp)
- C语言符号优先级——(“++”符号的的坑)
- 如何提高计算机打字,如何练电脑打字速度,教你如何科学提高打字速度
- 一世人中,最黑仔嘅一日
- 采用计算机辅助数据收集,关于计算机在数据收集中的作用分析
- oracle官方网址
- 4G、5G多卡聚合技术在打造智慧城市中的解决方案
- 手机如何扫码连接wifi
- 计算机辅助造型软件,AutoCAD 2010 专业的大型计算机辅助设计软件