三: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 ...
随机推荐
- QLCDNumber
继承于 QFrame 展示LCD样式的数字,它可以显示几乎任何大小的数字,它可以显示十进制,十六进制,八进制或二进制数 能够展示的字符: 0/O, 1, 2, 3, 4, 5/S, 6, 7, 8, ...
- vue-cli3热更新配置,解决热更新失败的问题,保存代码浏览器自动刷新
在vue,config.js中配置css热更新 const IS_PROD = ['production', 'test'].includes(process.env.NODE_ENV) css: { ...
- CSS定位机制之浮动定位float
一.浮动定位实现的效果 二.使用float实现浮动定位 三.使用clear属性清除浮动定位 四.浮动定位的应用(布局) 一.浮动定位实现的效果 (一).块元素(div)在文档流中默认垂直排列,如果 ...
- sh_09_格式化输出
sh_09_格式化输出 # 定义字符串变量 name,输出 我的名字叫 小明,请多多关照! name = "大小明" print("我的名字叫 %s,请多多关照!&quo ...
- OpenCV feature2d
/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMP ...
- ubuntu18.04设置静态IP
ubuntu18与ubuntu14.16设置静态ip地方方法不同,很多人没去读更新文档的时候往往会设置静态ip地址不成功,下面是具体的设置方法 做之前一定要确认自己操作系统的版本,每个版本设置的方法有 ...
- 基于python实现自动化办公学习笔记一
1.CSV(1)写csv文件 import csv def writecsv(path,data): with open(path, "w") as f: writer = csv ...
- React-Native 之 GD (十三)数据持久化(realm) 及 公共Cell
1.数据持久化 数据持久化是移动端的一个重要部分,刚发现 Realm 原来已经支持 React-Native 了 步骤一: 引入 realm $ npm install realm --save 步骤 ...
- node.js运行配置(vs code非控制台输出)
node.js运行配置(vs code非控制台输出) node 配置 简化 vs code 是非常强大的编译器,皆因它有有各种各样好用的插件. 在没有安装code runner插件之前,想要执行n ...
- [转]python常用的十进制、16进制、字符串、字节串之间的转换
阅读目录(Content) 整数之间的进制转换: 字符串转整数: 字节串转整数: 整数转字节串: 字符串转字节串: 字节串转字符串: 测试用的python源码 进行协议解析时,总是会遇到各种各样的数据 ...