主要垃圾回收器和垃圾回收算法
垃圾回收算法:
标记清除算法 mark-sweep 分为标记和清除两个阶段,但是内存碎片化严重
复制算法 copying 为了解决内存碎片化问题,但是空间利用率降低,主要用于大量对象存活时间短的年轻代垃圾回收
标记压缩算法 mark-compact compact紧凑使压实的意思,即标记后不是清除而是将仍存活的对象移向内存的一端,清理掉端界外的垃圾对象,主要用于老年代的垃圾回收
分代收集算法:是现在大多JVM采用的方法,即根据对象生存周期的不同把堆分为年轻代和年老代,采用不同的垃圾回收算法
分区收集算法:G1引入的回收算法,基于标记压缩算法,不会产生内存碎片。且避免全区域垃圾收集,它将整个堆空间划分为几个独立的小区间,每个小区间独立使用,独立回收,在后台维护一个优先级列表,每次可以根据允许的垃圾收集时间,优先收集垃圾最多的区域,而不是回收整个堆,精确控制GC停顿时间。
扫描堆中哪些对象是垃圾耗时比较长,所以诞生了并发标记,即三色标记,使用黑白灰,一轮轮去扫描,但是并发标记很容易造成错标和漏标(浮动垃圾),怎么解决错标的问题?
CMS采用增量更新的方法把黑的标成灰的,但是并发时多线程可能又给变成黑色。
G1采用SATB,把还没扫描到的对象,做一个快照,把引用引到堆栈,rememberSet中,保证了能再次扫描到这个垃圾region
但是G1也有问题,STW也比较长,几百毫秒颜色指针算法:ZGC采用的算法,利用指针来记录对象的状态,这样对象的销毁只需要改变指针内容即可,大大缩短了扫描时间,无论内存大小GC停顿都可以稳定在只有10毫秒左右,停顿时间和内存增长没有关系!!所以ZGC支持2的42次方=4T,最大16T级别的内存
不分代,但是将来可能分冷热对象
读屏障
颜色指针.全新的算法,和三色标记完全不同.原来的GC信息记录在对象头,而ZGC记录在对象的指针上,不用记录在对象上了.所以指针记录对象无用后,这个对象所处的内存就可以立即使用了!
在64位指针里分出4位来记录对象的状态m0 ,m1,remapped, finalizable
内存回收完可以立即使用
NUMA aware。之前CPU多了后,会再访问内存时产生竞争,浪费时间。所以NUMA引入,为每个CPU优先分配近的内存
常见垃圾收集器
CMS垃圾回收器以最短回收停顿时间为目的。CMS 是 Concurrent Mark Sweep 的缩写,意为并发标记清除,使用的是标记-清除算法,同时它又是一个使用多线程并发回收的垃圾收集器。一般比较注重服务端性能的时候使用它,它的回收过程可以分成四个步骤:1. 初始标记、2. 并发标记、3. 重新标记、4. 并发清除。
初始标记和重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots 能直接关联到的对象,速度很快,并发标记阶段就是进行GC RootsTracing的过程,而重新标记阶段就是为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍微长一些,但远比并发标记的时间短。由于整个过程中耗时最长的并发标记和并发清除过程,所以从总体上说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
UseParallelGC:可以有效的利用多CPU,最大化的提高程序吞吐量,但它不能与CMS收集器配合工作。
UseParNewGC :ParNew收集器是Serial收集器的多线程版本,在收集过程中,会stop-the-world。但它却是许多运行在Server模式下的虚拟机中首选的新生代收集器,很重要的原因是目前只有它能与CMS收集器配合工作。
常用的三个组合如下:
JVM参数 | Young | Old |
---|---|---|
JDK1.8默认的 | Parallel scavenge | Parallel Old |
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC | ParNewGC | CMS |
-XX:UseG1GC | G1 |
UseParNewGC 或者G1是需要手动开启的,目前常用的就是下面两种
主要垃圾回收器和垃圾回收算法相关推荐
- 常见的垃圾回收器及垃圾回收算法
我们知道,java为了让程序员更专注于代码的实现,而不用过多的考虑内存释放的问题,采用了自动的垃圾回收机制,也就是我们熟悉的GC. 有了垃圾回收机制后,程序员只需要关心内存的申请即可,内存的释放由系统 ...
- JVM调优理论篇_二、常用垃圾回收器(JVM10种垃圾回收器)以及垃圾回收算法
JVM调优理论篇_二.常用垃圾回收器以及垃圾回收算法 前言 一.垃圾回收基础 1.什么场景下使用垃圾回收 2.垃圾回收发生在哪个区域? 3.对象在什么情况下会被回收?(如何判断一个对象是否该被回收) ...
- 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?...
一.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 1.对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况. 通常, ...
- 一文弄懂JVM内存结构,垃圾回收器和垃圾回收算法
声明:本文从知乎上部分热门文章做二次整理,希望可以帮助更多的人,如有侵权,请联系删除. jvm 概述: jvm: java virtual machine, 用于把我们写的那些不能直接被程序识别的ja ...
- 几种常见的垃圾回收器和垃圾回收算法
目录 常用版本默认垃圾回收器 1. Serial 收集器(串行收集器) 2. Serial Old 收集器 3. ParNew 收集器 4. Parallel scavenge 收集器(吞吐量优先收集 ...
- python 垃圾回收器_Python 垃圾回收机制详细
引用计数 Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然 ...
- 记录java对象修改过的字段_Java垃圾回收器与内存回收策略
Java中,内存由虚拟机管理,控制着回收什么,什么时候回收,怎么回收. 在栈中内存的随线程产生和分配,销毁而回收,在堆中,需要制定一系列策略来判断该回收哪些区域,以及何时回收. 可达性分析 主流的做法 ...
- 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况.通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象.通过这种方式确定哪些对象是"可达的" ...
- 垃圾回收器的作用?垃圾回收器可以马上回收内存吗?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况.通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象.通过这种方式确定哪些对象是"可达的" ...
最新文章
- TCP/IP详解--第十一章
- setup.s 总结——Linux-0.11 剖析笔记(四)
- 【Linux系统编程应用】Linux音频编程接口
- Java 使用 POI 操作 Excel
- BZOJ 1071组队
- leetcode 75
- floodlight路由机制分析
- Unity3D资源加密解决方案
- 五款优秀的端口扫描工具
- 自制简易浏览器(Python)
- iphone8位置无法连接服务器,iphone8无法连接App Store怎么办?沈阳苹果维修点教你轻松解决!...
- 算法训练Day6:有效的字母异位词, 两个数组的交集,快乐数,两数之和
- 六、MFC 程序的生死因果 (学习笔记)
- 网上发现的一个 《Flashflex大全》
- 洛谷P1563 [NOIP2016 提高组] 玩具谜题 C语言 通俗易懂解法
- 微信企业邮箱登陆入口在哪?企业邮箱忘记密码怎么修改?
- 一本学习C#语言的学习手册(提供下载)
- Oracle数据库Blob字段存储文本文件
- Unity点击物体后,移动到物体所在位置
- 2019 节点: Love Wife Change Life
热门文章
- python3 xml 取标签显示内容_如何应用“XML+XSLT”技术分离Web表示层数据和样式
- SpringMVC_3.请求映射与静态资源处理
- Mongo服务器二进制文件修复,Mongodb-File-Server
- Android下常见的内存泄露
- android程序日历layout,Android使用GridLayout绘制自定义日历控件
- 今日arXiv精选:Transformer专题论文推荐
- ICLR 2021 | 使用CVAE学习干扰集,增强OOD以及对抗防御的能力
- 最新进展概述:澄清式提问辅助理解信息检索中的用户意图
- 15 篇最新 AI 论文来袭!NLP、CV...人人有份 | 本周值得读
- 二维计算几何基础知识