三:GC回收机制
jvm垃圾回收机制:
jvm中有个垃圾回收线程,它是低优先级的,当虚拟机空闲或堆内存不足时,它就会去清除不可达对象。
GC是如何去判断对象是否能被回收的
早期GC判断对象是否能被回收时用的引用计数法,后来改进成了可达性分析法。
引用计数法:比如A引用了B它就会记录下一个1 ,同理B也去引用A。引用计数法只有在为0的时候才回收对象,像这种“相互引用,循环引用”的对象其中一个没回收都是回收不了的。
可达性分析法:通过GCRoot去引用该对象,若不为空则不回收,为空则回收。
gcroot对象:线程在运行状态中不允许被回收的对象。 例如:局部变量,静态变量,常量,成员变量。
Minor GC与Full GC的触发时机
新生代内存不够用时候发生MGC也叫YGC,JVM内存不够的时候发生FGC
Minor gc在新生代内存不够的时候触发
Major gc在老年代内存不够的时候触发
Full gc在JVM内存不够的时候触发,它会清理新生代和老年代的空间。
垃圾收集器有哪些?
(1)串行收集器:使用单线程去做,是最稳定以及高效的收集器,可能产生较长的停顿。新生代复制算法串行执行、老年代标记-压缩串行执行。
(2)并行收集器:多线程去做。新生代复制算法并行执行、老年代标记-压缩串行执行。
(3)CMS收集器:是一种以获取最短回收停顿时间为目标的收集器,CMS收集器是基于“标记-清除”算法实现。
步骤流程:
初始标记:标记出 GC Roots 能直接关联到的对象
并发标记:从GC Root 开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行
重新标记:修正并发标记期间因用户程序导致标记产生变动的标记记录
并发清除:清除之前标记的对象
(4)G1收集器:和CMS收集器一样,都是4步操作。但是G1是采用"标记-压缩"算法来实现的。
优点:1. 相比于CMS,它不会有空间碎片化的问题。
2. 预判回收停顿时间,G1能算出最短时间内回收哪些垃圾对象的价值高。
Java对象在内存中的状态:
可 达: 对象创建之后,能被变量引用就是可达的。
可恢复: 对象没有引用指向时就成了可恢复状态,回收该对象之前调用finalize()进行清理,若在finalize()方法中重新被引用就会变成可达状态,反之就成为不可达状态。
不可达: 不被引用且finalize清理时也不能重新被引用就成了不可达状态。
强引用、软引用、弱引用、虚引用以及他们之间和gc的关系
强引用:指向通过new得到的内存空间的引用叫强引用,只要强引用还在,它宁愿out of memory内存溢出也不会回收。
弱引用:通过weakReference类来实现,不管内存是否充足都会回收.
软引用:通过SoftReference类来实现,内存溢出之前,回收
虚引用:虚引用通过PhantomRefence类实现,如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
常见的GC回收算法:
引用计数法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;计数器值为0的对象就是不再被使用的,垃圾收集器将回收该对象,若频繁被使用就将对象放到老年代中。
特点:执行速度比较快。但是"互相引用,循环引用"的对象却会都无法回收。(正是由于这个缺陷,这个算法不再被使用)
复制回收算法:用在新生代中;新生代中分为 eden s0 s1 三个区域,默认比例为8:1:1。我们创建对象时,对象存在eden区,当eden区块满时,就会触发GC将经常使用的对象放到s0区,如此反复当s0快满的时候,就将经常使用且存活的对象放入s1区,将s0中不可达的对象清理掉,下次eden区再有对象要移出来的时候就直接放到s1区。而s1快满的时候就会将常用且存活的对象放到s0区,其余的对象全部清理掉。当新生代的空间耗尽时,就会把经常使用的对象转移到老年代中。
特点:保证数据最大限度的停留在新生代中,新生代内存空间利用率达到90%。
标记-清除算法:根据特定的算法(如:引用计数算法,可达性分析算法等)标出内存中哪些对象可以回收,哪些对象还要继续用。标记指示回收,那就直接收掉;标记指示对象还能用,那就原地不动留下。
特点:标记与清除没有连续性效率低下,清除之后内存会产生大量碎片。
标记-压缩算法:用在老年代中;就是基于标记清除算法之上做的优化,把存活的对象压缩到内存一端,而后进行垃圾清理。不会造成内存碎片化!
三:GC回收机制的更多相关文章
- Goland的GC回收机制
Goland的GC回收机制 GC触发的条件 阈值:默认内存扩大一倍,启动gc 定期:默认2min触发一次gc,src/runtime/proc.go:forcegcperiod 手动:runtime. ...
- JVM组成、GC回收机制、算法、JVM常见启动参数、JAVA出现OOM,如何解决、tomcat优化方法
JVM组成.GC回收机制.算法.JVM常见启动参数.JAVA出现OOM,如何解决.tomcat优化方法
- Java GC回收机制
优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...
- java GC 回收机制 转
JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...
- python三种回收机制
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...
- java内存管理和gc回收机制
Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码 ...
- jvm gc回收机制
jdk8取消永久代,增加metaspace元空间.使用本地内存,不使用堆内存. jstat -gcutil jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause p ...
- 定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型
为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会. 面向对象编程也叫做OOP编程 简单来说 ...
- python 之gc(回收机制)--garbage collection(GC垃圾回收)
######################引用计数######################### 引用计数:python 当中一种用来解决垃圾回收的策略之一 char 1个字节(2**8) in ...
随机推荐
- SPOJ-GSS1-Can you answer these queries 1
链接: https://vjudge.net/problem/SPOJ-GSS1 题意: You are given a sequence A[1], A[2], ..., A[N] . ( |A[i ...
- 【leetcode】1170. Compare Strings by Frequency of the Smallest Character
题目如下: Let's define a function f(s) over a non-empty string s, which calculates the frequency of the ...
- vue的.sync 修饰符
很多时候,我们会对 prop (父子组件传递数据的属性) 进行“双向绑定” 在vue 1.x 中的 .sync 修饰符所提供的功能.当一个子组件改变了一个带 .sync 的prop的值时,这个变化也会 ...
- CSS定位机制之浮动定位float
一.浮动定位实现的效果 二.使用float实现浮动定位 三.使用clear属性清除浮动定位 四.浮动定位的应用(布局) 一.浮动定位实现的效果 (一).块元素(div)在文档流中默认垂直排列,如果 ...
- Comet OJ - Contest #6 C 一道树题 数学 + 推导
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- luogu 4381 [IOI2008]Island 单调队列 + 基环树直径 + tarjan
Description 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样 ...
- 洛谷 P4571 BZOJ 2257 [JSOI2009]瓶子和燃料
bzoj题目链接 上面hint那里是选择第2个瓶子和第3个瓶子 Time limit 10000 ms Memory limit 131072 kB OS Linux Source Jsoi2009 ...
- Laya 首日红点逻辑
Laya 首日红点逻辑 @author ixenos 2019-08-26 10:50:27 1.原理:显然,首日红点意味着包含进程销毁的情况,那么就要持久化存储信息,这里我们使用LocalStora ...
- 插头DP讲解+[BZOJ1814]:Ural 1519 Formula 1(插头DP)
1.什么是插头$DP$? 插头$DP$是$CDQ$大佬在$2008$年的论文中提出的,是基于状压$D$P的一种更高级的$DP$多用于处理联通问题(路径问题,简单回路问题,多回路问题,广义回路问题,生成 ...
- React Native商城项目实战12 - 首页头部内容
1.HomeTopView为首页头部内容,HomeTopListView为HomeTopView子视图. 2.HomeTopView.js /** * 首页头部内容 */ import React, ...