一篇文章让你了解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刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
随机推荐
- jenkins没安装git报错
Jenkins新建项目中源码管理使用Git时遇到如下问题: 在安装jenkins服务器上查看一下git版本,可能没有安装git 也可能是git版本太低 [root@localhost nnnnn]# ...
- VB.NET的一个邮件发送函数
''' <summary> ''' VB.NET邮件发送程序 ''' 还没用在别的服务器,不晓得能不能行,慎用! ''' </summary> ''' <param na ...
- oracle系列(二)用户管理
SQL> conn /as sysdbaConnected to Oracle Database 11g Express Edition Release 11.2.0.2.0 Connected ...
- iOS原生混合RN开发最佳实践
iOS原生混合RN开发详解 做过原生iOS开发或者Android开发的同学们肯定也都了解Hybrid,有一些Hybrid的开发经验,目前我们企业开发中运用最广泛的Hybrid App技术就是原生与H5 ...
- iOS视频播放(AVFoundation)
iOS视频播放(AVFoundation) 关于iOS平台的音视频处理,苹果官方提供了OC和swift接口的AVFoundation框架,可以进行各种音频播放和剪辑,底层实现使用了GPU加速,编解码效 ...
- Handshake Lemma
- finite undirected gragh ∑deg(v) = 2|E| In a k-ary tree where every node has either 0 or k children ...
- BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌dp)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3467 Solved: 1438[Submit][Status][Discuss] Descripti ...
- Java5~11新特性
Java5~11版本新特性 Java5 Java6 Java7 Java8 Java9 Java10 Java11 Java5 Java5开发代号为Tiger(老虎),于2004-09-30发行 特性 ...
- redhat6 快速部署percona
1.首先得能访问外网 2.yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-relea ...
- 转:Java中的cas
引自:https://blog.csdn.net/mmoren/article/details/79185862 本篇的思路是先阐明无锁执行者CAS的核心算法原理然后分析Java执行CAS的实践者Un ...