JVM——垃圾收集算法及垃圾回收器
一、垃圾回收算法
1、标记—清除算法
1)工作流程
算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象(标记阶段),在标记完成后统一回收所有被标记的对象(回收阶段)。
2)缺点
a. 效率问题:标记和清除这两个过程的效率都不高。
b. 空间问题:会产生大量的不连续碎片。
2、复制算法(新生代垃圾回收算法)
1)工作流程
将内存划分为大小相等的两块,每块只使用其中的一块,另外一块作为保留区域,当进行垃圾回收时,将使用区域的存活对象一次性进行赋值到保留区域,而后一次性清空使用区域。
2)使用场景
新生代垃圾回收,新生代对象具有朝生夕灭的特性(新生代对象存活率低)。
3)优点:实现简单,运行效率高,无空间碎片问题。
4)JVM采用的复制算法:
将内存划分(新生代内存)为一块较大的Eden区域和两块大小相等、空间较小的Survivor区域(Eden:Survivor = 8:1)。
每次使用Eden和其中的一块Survivor区域(第一块Survivor区域为from区域,另外一块为to区域)。
在进行垃圾回收时(Eden区域快满时,系统自动触发垃圾回收)
A. 第一次进行GC时,将Eden区中的对象移动到from区域。
B. 第二次再进行GC时,将Eden区和from区中存活的对象移动到to区域,然后一次性清除掉Eden和from区,以此循环。
C. 对象在from区域和to区域来回移动15次(默认),将对象移动到老年代。
D. 特殊情况:当Survivor区域放不下存活对象时,会从老年代进行分配担保。
3、标记整理算法(老年代回收算法)
复制算法在对象存活率比较高的情况下,会有大量对象复制操作,效率很低,因此,老年代不采用复制算法。
1)工作流程:
标记阶段和标记清除阶段的标记类似,标记出无用对象。
整理阶段:将存活对象向一端移动,而后一次性将存活对象边界以外的空间清除掉。
4、分代回收算法
Java采用分代回收算法,即新生代采用复制算法,而老年代采用标记整理算法。
将内存划分为新生代(对象存活率低)和老年代(对象存活率高)。
面试考点:请问了解Minor GC和Major GC吗?
Minor GC:新生代GC,指的是新生代垃圾回收,在新生代中,对象大多数朝生夕灭,因此采用复制算法,Major GC发生频繁,效率较高,
Major GC (老年代GC/Full GC):指的是发生在老年代的垃圾回收,发生Full GC通常会至少发生一次Minor GC,但并非绝对,Full GC 速度比Minor G从速度慢10倍以上,发生频率较低。
二、垃圾回收器
并行:指的是多条垃圾回收线程并行工作,而用户线程等待。
并发:用户线程与垃圾回收线程同时执行(不一定并行,可能交替执行),用户线程继续执行,垃圾回收线程运行在另外的内核中。
吞吐量:CPU运行用户代码时间/CPU总时间
CPU总时间即用户代码时间+垃圾回收时间
新生代垃圾回收器:Serial、ParNew、Parallel scavenge
老年代垃圾回收器:SeralOld、ParallelOld、CMS
全区域垃圾回收器:G1
1、Serial收集器(新生代垃圾回收,串行收集器)
(1)特性:Serial是一个单线程收集器,在Serial进行垃圾收集时,必须暂停其他所有的工作线程,直到Serial收集器手机结束(STW)。
(2)应用场景:Serial收集器是JVM运行在Client模式下默认的新生代收集器。
(3)优点:简单而高效,对于单核CPU,Serial收集器由于没有线程交互开销,可以获得最高的单线程收集效率。
2、ParNew收集器(新生代收集器,并行GC)
(1)特性:ParNew收集器是Serial收集器的多线程版本。
(2)应用场景:PerNew是许多运行在Serial模式下的JVM首选新生代收集器。
(3)优点:随着可使用CPU数量的增加,对于GC时系统资源的利用有较大帮助。
3、Parallel Scavenge 收集器(吞吐量有限收集器,新生代收集器,并行GC)
(1)特性:吞吐量
两个参数控制吞吐量:
a. .-xx:MaxGCPauseMillis:控制最大垃圾收集器停顿时间。
b. .-xx:GCRatio:直接设置吞吐量大小
(2)应用场景:高吞吐量场景,适合需要与用户交互的程序(B/S架构),良好的响应速度提升用户体验。
(3)优点:与ParNew收集器比较:高吞吐量。
GC自调节策略(-xx:+UseAdaptiveSizePolicy)
4、Serial Old收集器(老年代收集器,并行GC)
(1)特性:Serial Old是Serial老年代版本,单线程收集器,实用标记整理算法。
(2)应用场景:
1)Client模式下:Serial Old主要也在于给Client模式下的虚拟机使用。
2)Server模式下:作为CMS收集器的后备预案,当CMS发生并发失败问题时使用。
5、Parallel Old收集器(老年代收集器,并行GC)
(1)特性:Parallel Old是Parallel Scavenge老年代版本。
(2)应用场景:注重吞吐量以及CPU资源敏感场合。
6、CMS(老年代垃圾收集器,并行GC):采用标记清除算法
(1)特性:CMS收集器是以获得最短系统停顿时间为目标的垃圾回收器。
(2)应用场景:B/S系统:服务端。B/S系统重视服务器的响应速度,希望系统停顿时间尽可能短,CMS收集器非常符合此类应用需求。
(3)优点:并发收集,低停顿。
(4)缺点:对CPU资源敏感,产生大量空间碎片。
7、G1(全区域垃圾回收器)
应用场景:应用于低停顿场景。
JVM——垃圾收集算法及垃圾回收器的更多相关文章
- JVM 垃圾回收算法和垃圾回收器
JVM 垃圾回收算法和垃圾回收器. 一.垃圾回收的区域 栈:栈中的生命周期是跟随线程,所以一般不需要关注. 堆:堆中的对象是垃圾回收的重点. 方法区:这一块也会发生垃圾回收,不过这块的效率比较低,一般 ...
- JVM 垃圾收集算法 标记-清楚、标记-复制、标记-整理
摘要 Java程序在运行过程中会产生大量的对象,但是内存大小是有限的,如果光用而不释放,那内存迟早被耗尽.如C.C++程序,需要程序员手动释放内存,Java则不需要,是由垃圾回收器去自动回收. 垃圾回 ...
- JVM垃圾收集算法(标记-清除、复制、标记-整理)
[JVM垃圾收集算法] 1)标记-清除算法: 标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象(错了吧?) 清除阶段:清除所有未被标记的对象 2)复制算法: 将原有的内存空间 ...
- 深入理解JVM(五)——垃圾回收器
轻松学习JVM(五)——垃圾回收器 上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中, ...
- JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...
- java架构之路-(12)JVM垃圾回收算法和垃圾回收器
接上次JVM虚拟机堆内存模型来继续说,上次我们主要说了什么时候可能把对象直接放在老年代,还有我们的可能性分析,提出GCroot根的概念.这次我们主要来说说垃圾回收所使用的的算法和我们的垃圾回收器,需要 ...
- Jvm垃圾收集器和垃圾回收算法
概述: 目前内存的动态分配和内存的回收技术已经相当成熟,一切看起来都已经进入了“自动化”时代,为什么还要去了解GC和内存分配呢?原因很简单:当需要排查各种内存泄漏.内存溢出问题时,当垃圾收集器成为系统 ...
- Java垃圾回收算法和垃圾回收器
基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除的算法最简单,主要是标记出来需要回收的对象,然后然后把这些对象在内存的信息清除.如何标记需要回收的对象,在上一篇文章里面已经有说明. 标记- ...
- [JVM 相关] Java 新型垃圾回收器(Garbage First,G1)
回顾传统垃圾回收器 HotSpot 垃圾收集器实现 Serial Collector(串型收集器) 使用场景,大多数服务器是单核CPU. 适用收集场景:1. 新生代收集(Young Generatio ...
随机推荐
- 攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup
攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup 题目介绍 题目考点 模板注入 Writeup 进入题目 import flask import os a ...
- C++ new 运算符 用法总结
C++ new 运算符 用法总结 使用 new 运算符 分配内存 并 初始化 1.分配内存初始化标量类型(如 int 或 double),在类型名后加初始值,并用小括号括起,C++11中也支持大括号. ...
- 羽夏看Win系统内核——系统调用篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- 【数据结构&算法】10-串基础&KMP算法源码
目录 前言 串的定义 串的比较 串的抽象类型数据 串与线性表的比较 串的数据 串的存储结构 串的顺序存储结构 串的链式存储结构 朴素的模式匹配算法 模式匹配的定义 朴素的匹配方法(BRUTE FORC ...
- Python 操作 Redis 发布订阅
Python 操作 Redis 发布订阅 介绍 Redis可以通过多个客户机订阅相同的频道,一个服务机在相应频道进行发布,从而实现在客户机收听服务机发布相应信息,可以利用这个机制实现多个客户机之间的信 ...
- 设计模式学习-使用go实现外观模式
外观模式 定义 适用范围 代码实现 优点 缺点 关于接口粒度的思考 参考 外观模式 定义 外观模式也叫门面模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接 ...
- [tc14634]ExtremeSpanningTrees
保序回归论文题 要求某一个边集为原图的最小生成树,这等价于非树边比所在环(指树上)的所有边小,最大生成树类似 将这些大小关系的限制看作一张有向图,即若要求$w_{i}\le w_{j}$则连边$(i, ...
- [luogu6860]象棋与马
根据扩欧$(a,b)=1$必须要满足,同时,若$a+b$为偶数则格子的"奇偶性"不变,因此$a+b$必须为奇数 反过来,容易证明满足$(a,b)=1$且$a+b$为奇数则一定可行( ...
- [loj3247]Non-Decreasing Subsequences
分治,考虑分治到[l,r]的区间(设$mid=(l+r)/2$),将询问分为两类:1.在左/右区间,直接递归下去:2.跨越中间,那么处理出两个数组:L[i][j]表示左区间在开头第i个位置,以数字j为 ...
- SpringMVC---Json的使用
1.所需文件 2.pom中加入json <?xml version="1.0" encoding="UTF-8"?> <web-app xml ...