一篇文章让你了解GC垃圾回收器
简单了解GC垃圾回收器
了解GC之前我们首先要了解GC是要做什么的?顾名思义回收垃圾,什么是垃圾呢?
GC回收的垃圾主要指的是回收堆内存中的垃圾对象。
从根对象出发,所有被引用的对象,都是存活对象 其他对象,都是垃圾对象。
根对象:
栈中的引用变量,所引用的对象。
方法区经静态变量所引用的对象。
GC回收的三种基本方式
一、标记-清除
标记存活对象,清理其他垃圾对象(阴影为存活对象,空白为垃圾对象)
优点:效率高
缺点:产生碎片,使内存分布碎片化,造成内存空间不连续。若出现大的对象,内存空间不连续则难以存取

二、标记-整理
标记存活对象,清除垃圾对象,对垃圾对象进行整理
优点:没有碎片
缺点:效率低

三、复制
在内存中分配两块内存,将标记的存活对象复制到另一块内存当中,
再将原内存的对象清除。
优点:效率高
缺点:浪费内存

内存分区
新生代
老年代
永久代(方法区)(在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代)
新生代
主要是用来存放新生的对象。一般占据堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收
新生代又分为伊甸园与生存区,生存区分为ServivorFrom、ServivorTo
- Eden区(伊甸园):Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。
- ServivorTo:保留了一次MinorGC过程中的幸存者。
- ServivorFrom:上一次GC的幸存者,作为这一次GC的被扫描者。
过程:
新建对象,在伊甸园分配内存
伊甸园存满,复制到from
from存满,复制到to,并交换角色
对象在from,to之间复制15次,晋升到老年代

老年代
标记-清除、标记-整理
间隔一段时间,会执行一次小范围垃圾回收
当老年代空间占用到一定比例 0.85,会执行full-gc
当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。
常见的垃圾回收器
- 串行垃圾回收器(Serial Garbage Collector)
- 并行垃圾回收器(Parallel Garbage Collector)
- 并发标记扫描垃圾回收器(CMS Garbage Collector)
- G1垃圾回收器(G1 Garbage Collector)
了解主要的两种(CMS,G1)
CMS - 并发的标记-清除
STW(Stop The World)时间非常短暂
初始标记(stw)
只标记根对象
并发标记
垃圾回收器,与其他java程序并行执行
重新标记(stw)
并发清除
与其他java程序并行执行,配置参数过多,使用过于复杂
总结:
是一种以获得最短回收停顿时间为目标的收集器,基于标记清除算法。过程如下:初始标记,并发标记,重新标记,并发清除,
优点是并发收集,低停顿,缺点是对CPU资源非常敏感,无法处理浮动垃圾,收集结束会产生大量空间碎片。
G1 - Garbage First
内存被划分成几千个内存块
有伊甸园、生存区、老年代
用复制算法
G1会找到垃圾最多的内存块,优先回收
配置参数非常简单,只需要配置目标停顿时间(stw),G1自动调整其他参数,来达到预期的停顿时间
总结:G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的
堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域
一篇文章让你了解GC垃圾回收器的更多相关文章
- [Java基础]-- Java GC 垃圾回收器的分类和优缺点
https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 参考:elasticsearch实战-使用G1 ...
- .NET GC垃圾回收器
GC垃圾回收器简介 全名: Garbage Collector 原理: 以应用程序的根(root)为基础,遍历应用程序堆(heap)上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡 ...
- 如何获取GC(垃圾回收器)的STW(暂停)时间?
前言 在现代的容器化和微服务应用中,因为分布式的环境和错综复杂的调用关系,APM(Application Performance Monitoring 应用性能监控)显得尤为重要,它通过采集应用程序各 ...
- GC垃圾回收器
java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”.jvm解决的两个问题:给对象分配内存以及回收分配给对象的内存.GC:将内存中不再被使用的对象进行回收.GC的作用域是JVM运行时 ...
- 一篇文章说完Java的垃圾回收过程
想要了解java的垃圾回收过程首先要理解java堆的内存模型,简单表示如下: 从上面的图片可以看出,java的堆内存可以简单的分为,新生代和老年代,在新生代中有分为三个区域,1个Eden区和2个S ...
- GC(垃圾回收器)中的算法
GC的两种判定方法 (1) 引用计数法 给对象添加一个引用计数器,每当引用一次+1,每次失效时-1,当计数器为0时,表示对象就是不可能再被使用的. (2) 可达性分析算法 将“GC Roots”对象作 ...
- Java虚拟机笔记(二):GC垃圾回收和对象的引用
为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...
- Android内存优化5 了解java GC 垃圾回收机制3
引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Andro ...
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
随机推荐
- mime中间件
mime中间件Demo,里面用到的有 1.path模块 //引入模块 var path=require('path'); 2.extname方法 //获取文件的扩展名 var extname=path ...
- ARM v7-A 系列CPU的MMU隐射分析
ARM v7-A 系列CPU的MMU隐射分析 摘要:ARM v7-A系列的CPU加入了很多扩展,如多核处理器扩展.大物理地址扩展.TrustZone扩展.虚拟化扩展.若支持大的物理地址,则必须支持多核 ...
- WinCE下的串口通信开发(VS2005,VB.Net,VC++)
WinCE下的串口通信开发(VS2005,VB.Net,VC++) WinCE下的串口通信开发 一.利用Visual Basic 开发很简单,因为有现成的控件可以直接调用 以VS2005为例,首先 ...
- Vue01 vue基础、mvvm、ES6z知识点、计算属性、生命周期
Vue案例: <body> <div id="app"> <!--第一部分--> <fieldset> <legend> ...
- bootstrap-table页码ALL显示为NAN
在github上查阅找到的解决办法: https://github.com/wenzhixin/bootstrap-table/issues/435 页面部分: data-page-list=&quo ...
- uiwebview与objective-c
利用oc调用js很简单, 系统直接提供了方法stringByEvaluatingJavaScriptFromString [webView stringByEvaluatingJavaScriptFr ...
- SpringMVC——笔记
使用 @RequestMapping 映射请求 Spring MVC 使用@RequestMapping 注解为控制器指定可以处理那些URL请求. 在控制器的类定义及方法定义处都可以标注 @Reque ...
- 嗨翻C语言笔记(一)
对自己狠一点,逼自己努力,总有一天你会感谢今天的自己! C语言不支持现成的字符串, 只能用数组表示. & (and)运算, 即两个数的每个二进制位都进行比较, 对等位均为1时为1, 否则为0. ...
- 阿里云Docker镜像仓库(Docker Registry)
镜像仓库申请地址: https://cr.console.aliyun.com/cn-shanghai/instances/repositories 一.创建命名空间 例如daniel-hub ...
- Django学习笔记2
1.BookInfo.objects.all() objects:是Manager类型的对象,用于与数据库进行交互 当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管 ...