马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本人在这篇文章中解说了垃圾采取机制,这为前置知识
美团一面面经:Threadlocal(线程局部变量的原理)->内存走漏题目->垃圾采取机制_threadlocal采取-CSDN博客
起首对前置知识弊端做一个增补:java的引用范例
- 强引用:被仍一GC Roots对象【强引用】的对象,该对象都不会被垃圾采取
- 软引用:仅有软引用该对象时,在垃圾采取后,假如内存仍不敷会再次触发垃圾采取
- User user=new User();
- SoftReference softReference =new SoftReference (user)
复制代码
- 弱引用:仅有弱引用该对象时,垃圾采取无论内存是否富足都会采取弱引用对象,必要共同SoftReference(软引用)利用。此时就是ThreadLocal内存走漏的缘故因由
- User user=new User();
- WeakReference weakReference=new WeakReference(user)
复制代码
- 虚引用:必须共同引用队列利用,被引用对象采取时,会将虚引用入队,由Reference Handler线程调用虚引用干系方法开释直接内存
JVM 有哪些垃圾采取器?
- 串行垃圾网络器
- 并行垃圾网络器
- CMS(并发)垃圾网络器
- G1垃圾网络器
串行垃圾网络器
Serial和Serial Old串行垃圾网络器,是挑拨用单线程举行垃圾采取,堆内存较小,得当个人电脑
- Serial 作用于新生代,采取复制算法
- Serial Old作用与老年代,采取标志-整理算法
垃圾采取时,只有一个线程在工作,而且java应用中的全部线程都要停息(STW),等候垃圾采取的完成
一个线程举行垃圾采取,其他线程壅闭
并行垃圾网络器
Parallel New和Parallel Old是一个并行垃圾采取器,JDK8默认利用此垃圾采取器
- Parallel New作用于新生代,采取复制算法
- Parallel Old作用于老年代,采取标志-整理算法
在举行垃圾采取的时间,全部线程都要举行停息(STW),等候垃圾采取的完成
多个线程同时举行垃圾采取
CMS(并发)垃圾网络器
CMS是利用标志-扫除算法的、仅仅针对老年代的垃圾采取器。
1.以最短采取停顿时间为目标的网络器、停顿时间短
2.举行垃圾采取时,应用任然能正常运行
1.初始化阶段,指挥标志与GCRoots之间关联的A。(找出GCRoots之间引用的节点)
2.并发标志的时间,会根据引用链路标志B、C、D(根据引用链路标志节点)
3.重新标志阶段,由于初始化阶段和并发标志阶段中其他线程都是可以运行的,以是就会存在漏标志的题目。在此期间,假如X被引用了,那么重新标志会标志X,假如D大概B没有被引用了也会取消对应的标志。(末了查抄在此期间是否有其他线程引用了新节点大概取消了新节点的引用)
4.并发清算
G1垃圾采取器
1.应用于新生代和老年代,JDK9的默认采取器
2.分别多个地区,每个地区都可以充当eden区,survivor,old,humongous,此中humongous转为大对象预备
3.采取复制算法
4.并发失败会触发Full GC
5.分为三个阶段:新生代采取、并发标志、混淆网络
1.年轻代垃圾采取
- 初始时,全部地区都处于空闲状态
- 创建了一些对象,跳出一些空闲地区作为伊甸园区存储这些对象
- 当伊甸园必要垃圾采取时,跳出一个空闲地区作为幸存区,用复制算法复制存活对象,必要停息用户线程
- 随着时间流逝,伊甸园的内存又有不敷
- 将伊甸园以及之前心存区中的存活对象,采取复制算法,复制到新的幸存区,此中较老对象提拔至老年代
2.年轻代垃圾采取+并发标志
当老年代占用内存凌驾阈值(默认45%)后触发并发标志,这是无需停息用户线程
1.并发标志之后,会有重新标志阶段办理漏标题目,此时必要停息用户线程
2.这些都完成后就知道了老年代有哪些存活对象,随后进入混淆网络阶段。此时不会对全部老年代地区举行采取,而是根据停息时间目标 优先采取代价高(存活对象少)的地区
混淆垃圾采取
混淆网络阶段中,到场复制的有 eden、survivor、old
这次采取中:
1.eden区和s区的垃圾采取都将存活对象放入新的S区中
2.s区中到达阈值的存货对象和old区占用内存凌驾45%的颠末GC后的存货对象放入新的O区中
复制完成,内存得到开释。进入下一轮的新生代采取、并发标志、混淆网络
一个对象假如太大了会存入一个巨型对象中,一个地区装不下,会分配一连的地区举行存储
文章部分图片来自互联网网络
|