虚拟机回收小结
Posted bibo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟机回收小结相关的知识,希望对你有一定的参考价值。
java区别去C、C++最大的特点就是垃圾回收
垃圾回收主要要点:
1、回收算法(回收哪些对象)
2、回收器(怎么回收)
查找垃圾对象
1、引用计数
每个对象都包含一个引用计数器,表示该对象被引用的次数,如果为0,则表示为游离对象,可以被回收;
不能解决环形引用。
2、根搜索
根据一批根对象搜索引用的所有对象、以及整个引用链上的对象,未在引用链上的对象就是垃圾对象。
回收算法
标记-回收:标记根对象(一批)能到达的对象,回收剩下的对象。(简单、磁盘碎片多)
标记-复制:同标记-回收的标记一样,将堆划分为两块区域,当需要回收时,会将存活的对象拷贝到新的区域,然后回收所有旧的区域。(回收效率高、空间浪费)
标记-整理:同标记-回收大致一样,只是在回收前会将存活的对象移动到内存的一端,然后回收剩下的垃圾数据。(节约空间、回收效率高)
回收器
A、串行
Serial(复制)、Serial-Old(标记-整理)
默认client模式会使用,stop the world
B、并发
ParNew 是 Serial的多线程版本
Parallel Scanvenge(复制算法) 和 Parallel Old
Concurrent Mark Sweep:基于标记-清除算法、低停顿(3次标记(stop the world)、清除);CPU敏感、浮动垃圾无法处理、内存碎片需要FULL GC来帮助清理。
C、G1 Garbage First 低停顿、高吞吐。会stop the world
将内存换分为新生代、老年代后,在切分成不同的块(Region)
新生代会暂停所有应用,然后将对象拷贝到存活区或者老年代,老年代也是通过拷贝的方式来完成清理,能有效的控制磁盘碎片。
当磁盘空间不足时会降级到Serial回收方式。
Humongous区,为大对象分配区域,一般为连续的内存块。
新生代和老年代引用问题:CMS 通过 point out,通过一块内存记录所有老年代指向新生代的对象应用;G1已经分片切块,不需要记录所有的老年代引用,所以提出了point in 概念,只存取老年代到新生代某块的引用,可以降低扫描整个老年代的问题。
G1 的mix GC 算法也是:标记-拷贝,在标记时同CMS一样也会Stop the world,清理阶段也会Stop the world。
G1 新提出了三色标记算法:
黑色:根对象或它的子对象已经被扫描
灰色:本身被扫描、还没扫描完该对象的子对象
白色:未被扫描的对象或垃圾对象
成都市高新区天府软件园C区C2-101号
以上是关于虚拟机回收小结的主要内容,如果未能解决你的问题,请参考以下文章
Java 虚拟机原理垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )