jvm 垃圾回收算法
来源:互联网 发布:古埃及人知乎 编辑:程序博客网 时间:2024/06/11 23:38
jvm 垃圾回收算法
- 引用计数法
- 标记清除法
- 标记压缩法
- 复制算法
- 分代算法
- 分区
引用计数法
引用计数法,就是只要有对象引用,计数就加1,垃圾清理的时候对计数为0的直接清理。缺点:循环引用的问题,无法解决,因此java 回收器没有用这个算法。
标记清除法
标记清除主要分为两个阶段:标记阶段和清除阶段,标记阶段首先通过根节点,标记所有从根节点开始可到达的对象,因此,未被标记的就是未被引用的对象,清除阶段,就清除所有未被标记的的对象。次算法可能产生大量的空间碎片。
标记压缩算法
标记压缩算法是一种老年代回收算法,它在标记清除的算法基础之上做了一些改进,它在标记阶段跟标记清除算法一致,但是之后,并不是简单地清除未标记的对象,而是将所有的存活对象压缩到内存的一端,之后在清除为标记的所有对象。
复制算法
复制算法的核心思想:将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正式使用的内存中的存活对象赋值到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。次算法代价很大,相当于将可以使用的内存缩小为了原来的一半。 还浪费资源
Jvm 新生代回收器,基本都是使用复制算法。新生代,分为eden空间、from空间和to空间3个部分,其中from和to空间可以视为用于复制的两块大小相同,地位相等且可以进行角色互换的空间块。from和to 也被称为survivor空间,即幸存者空间,用于存放未被回收的对象。
在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。
分代算法
上面介绍的算法各有优缺点,没有谁能替代谁,故jvm引入分代算法,将内存区间根据对象的生命周期特点分成几块,每块选择不同的算法,以提供垃圾回收的效率。
新生代 一般采用 复制算法,老年代,采用标记清除,标记压缩算法。
分区
分区算法将整个堆空间划分成连续的不同小区间,每个小区间独立使用,独立回收,这种算法的好处是可以控制一次回收多少个小区间。未来G1回收器就是使用次算法。
下一张介绍一下回收器和GC调优日志
- JVM 垃圾回收算法
- JVM 垃圾回收算法
- JVM 垃圾回收算法
- JVM 垃圾回收算法
- JVM 垃圾回收算法
- JVM 垃圾回收算法
- jvm垃圾回收算法
- JVM 垃圾回收算法
- JVM垃圾回收算法
- Jvm垃圾回收算法
- JVM垃圾回收算法
- JVM垃圾回收算法
- JVM垃圾回收算法
- jvm垃圾回收算法
- JVM 垃圾回收算法
- JVM垃圾回收算法
- JVM 垃圾回收算法 .
- jvm垃圾回收算法
- ccf csp 201612-2 工资计算
- hibernate--11.hql查询
- 基本汇编指令
- java基础系列(八)之自定义序列化
- 比赛13 总结
- jvm 垃圾回收算法
- ARKit-带你走进全新的世界(四:平面检测)
- offer4
- Mongodb带权限控制的安装服务并新建个管理账户和一般数据库用户
- MVC模式简介
- 初识Java多线程
- 【51Nod1810】连续区间
- Android屏蔽ListView部分Item点击事件
- ZOJ 3203 Light Bulb