JVM GC简介
1.GC策略
引用计数法 引用计数没有归0永远不会被回收
跟搜索算法 消除引用计数的弊端 设置若干跟对象当任何一个跟对象到一个对象不可达时, 认为该对象可以被回收跟对象:虚拟机栈的引用对象(本地变量表)方法区的静态属性引用的对象方法区的常量引用的对象(final)本地方法栈中JNI的引用对象(本地变量表)
2.垃圾回收算法
标记清除算法:标记:遍历所有的GC ROOT, 将所有gc root 可达的对象标记为存活的对象清除:将所有没有标记的对象全部清除缺点:效率比较低(递归遍历全堆对象)清理出的内存不连续
复制算法 新生代使用的算法, 缺点:浪费一半的内存空间
标记整理算法 与标记清除算法比较类似, 缺点:标记存活对象与地址
3.GC分代回收
新生代:0.8eden区 0.1×2 survivor区 复制算法
年老代:标记清除 标记整理算法
永久区:标记清除 标记整理
4.垃圾回收器
串行回收期(serial collector):它只有一条GC线程(client模式默认采用模式)
实现: serial适用于新生代, 采用复制算法, serial old适用于年老代, 采用标记整理算法
标记压缩算法:首先找出年老代的存活对象,然后将他们滑动至堆的顶部,从而将所有的空闲空间留在堆尾部的连续块中,这使得任何在年老代的分配操作可以使用快速的指针碰撞技术。
适用范围:对停顿时间要求不高和在客户端运行的应用并行回收期(parallel collector):吞吐量优先,它有多条GC线程(server模式默认采用模式)
实现: ParNew适用于新生代, 采用复制算法;Parallel Scavenge, 适用于新生代, 采用复制算法;parallel old(多线程), 适用于年老代 采用标记整理算法
适用范围:需要吞吐量高的应用并发搜集器(concurrent collector):它有一条或多条GC线程
实现:需要在部分阶段暂停用户程序,CMS适用于年老代, 采用标记清除算法
步骤:
初始标记:stop, 快速标记存活对象,标记年老代GC root 直接可达的对象
并发标记:并发标记所有从GC root可达的对象
并发预清除:替代重现标记的一部分工作量
重新标记:stop, 重新遍历并发标记阶段有变动的对象
并发清除:清除未标记对象
适用范围:低延时优先
注意事项:
吞吐量比较低,并且Minor GC的时间被拉长
内存碎片
并发模式失败 serial old作为备选G1(CMS的替代者,简单提及,详细内容以后更新)
实现:将堆分成一个大小相同的区域(Region),也分代(但是是一组Region,可能连续)
将Region中的存活对象转移到另外的Region,然后收集
5.Minor GC与Full GC
Minor GC
Eden区几乎总是空的,Eden区满会触发Minor GC
Survivor区存放的对象至少经过一次Minor GC
GC后Eden的存活对象被复制到未使用的Survivor区,被占用的Survivor区不够老的存活对象被复制到未使用的Survivor区,被占用的Survivor中足够老的存活对象被提升到年老代。
过早提升和提升失败:如果一个Survivor区不够存放存活对象时,多余的对象被提前移动到年老代,如果年老代无法容纳更多的对象,Minor GC后会进行Full GC。Full GC
包含新生代、年老代、永久区
- 点赞
- 收藏
- 关注作者
评论(0)