GC垃圾回收

JVM大部分时候回收的都是新生代(伊甸区+幸存0区+幸存1区)。按照回收的区域可以分成两种类型:Minor GC和Full GC(MajorGC)。

  • Minor GC:只针对新生代区域的GC,大多数Java对象的存活率都不高,Minor GC非常频繁,回收速度快。
  • Full GC:发生在老年代的GC,经常会伴随至少一次的Minor GC(但不一定会),Full GC扫描的范围更广泛,Full GC的速度比Minor GC慢10倍以上。

GC四大算法

引用计数法

对于单个对象来说,当有引用发生,引用计数器就+1;当丢失引用,引用计数器就-1。当引用数减到0的时候,说明对象不再有用,被垃圾回收。引用计数法缺点是每次对对象赋值都要维护引用计数器,且计数器本身也有一定的消耗,难以处理引用循环(例如:对象双方互相引用,但实际上二者为空,此时双方引用都不为空)。JVM的实现一般不采用这种方式。

复制算法

年轻代中使用的是Minor GC,这种Minor GC采用的是复制算法。复制的思想是将内存分为2快,每次只用其中一块,当这一块内存用完,就将或者的对象复制到另一块上面,复制算法不会产生内存碎片。

HotSpot JVM中年轻代可以分成三个部分:Eden区、Survivor0区,Survivor1区,默认比例为8:1:1。Survivor的两个区在逻辑上可以视为from区和to区,每次GC后会交换from区和to区,在Eden区和from区满之前,to区始终是为空的区。如果to区也被填满了,所有对象移动到老年代。

新创建的对象一般会被分配到伊甸区,经过一次Minor GC后,如果对象还存活,就会被移到Survivor区。from区的对象如果继续存活,且能够被另一块幸存区to区容纳,则使用复制算法将这些仍然存活的的对象复制到另一块幸存区to区中,然后清理使用过的Eden和from区(下一次分配就从to区开始,to区成为下一次GC的from区),且这些对象的年龄设置为1,以后对象在幸存区每经历一次Minor GC,对象的年龄就会+1,当对象的年龄到达某个阈值的时候,这些对象就会进入老年代。(阈值默认是15,可以通过-XX:MaxTenuringThreshhold来设定对象在新生代在存活的次数)。

这种算法的优点了不会产生内存碎片,缺点是浪费内存空间,在HotSpot虚拟机中8:1:1的比例下,可用内存为80%+10%,有10%的内存会被浪费掉。如果对象存活率很高,就需要将所有对象都复制一边,并重置引用地址。

标记清除(Mark-Sweep)

老年代一般是由标记清除 或者 标记清除和标记整理的混合实现的。

标记清除算法分为两个步骤,先标记出要回收的对象,然后统一回收这些对象。

优点是节约内存空间,不需要额外空间。缺点是两次扫描,标记和清除的效率都不高,耗时严重。标记清除后会产生大量不连续的内存碎片。内存碎片会导致以后程序需要分配大对象的时候,找不到足够的连续内存,导致提前触发GC。

标记整理(Mark-Compact)

和标记清除一样,先标记出要回收的对象,然后让存活对象都向一端移动,直接清理掉端边界 以外的内存。

优点是没有内存碎片,缺点是效率不高,需要标记存活对象还要整理存活对象的引用地址,从效率上来说是不如复制算法的。

还有一种折衷的方案,将标记清除和标记整理算法相结合,一般直接标记清除,当GC达到一定次数的时候,进行一次标记整理,从而减少了移动对象的成本,又有处理内存碎片的步骤。

总结

效率排名:复制算法>标记清除>标记整理

内存整齐度:复制算法=标记整理>标记清理

内存利用率:标记整理=标记清理>复制算法

四种算法各有优劣,一般的JVM实现会采用分代收集算法,根据不同代所具有的不同特点使用不同的算法。

年轻代的特点是区域较小,对象存活率低,适合使用复制算法。复制算法的效率只和当前存活对象的大小有关,适用于年轻代的回收,内存利用率不高的问题HotSopt通过两个survivor的设计进行和缓解,新生代可用容量为80%+10%,只有10%的内存被浪费掉。

老年代的特点是区域较大,对象存活率高,适合使用标记清除/标记整理算法。

【JVM】垃圾回收的四大算法的更多相关文章

  1. jvm 垃圾回收机制和算法(转)

    stop-the-world 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC ...

  2. jvm 垃圾回收概念和算法

    1.概念 GC 中的垃圾,特指存在于内存中.不会再被使用的对象.垃圾回收有很多种算法,如引用计数法.复制算法.分代.分区的思想. 2.算法 1.引用计数法:对象被其他所引用时计数器加 1,而当引用失效 ...

  3. JVM垃圾回收机制和常用算法

    由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...

  4. Java基础:JVM垃圾回收算法

    众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...

  5. 简述 JVM 垃圾回收算法

    经典垃圾回收 标记-清除(Mark-Sweep) 研发园开了家新餐厅,餐厅老板在考虑如何回收餐盘时首先使用了最简单的方式,那就是服务员在顾客用餐的过程中,不定时的观察餐厅,针对用完餐的顾客记录他们的位 ...

  6. JVM垃圾回收算法解析

    JVM垃圾回收算法解析 标记-清除算法 该算法为最基础的算法.它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收.该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高, ...

  7. JVM垃圾回收算法(最全)

    JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:j ...

  8. JVM垃圾回收算法及回收器详解

    引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...

  9. 谈谈JVM垃圾回收机制及垃圾回收算法

    一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制 ...

随机推荐

  1. Java面试题:抽象类和接口的区别

    1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系.但是,一个类却可以实现多个interface. 2.在abstract class 中可以有自己 ...

  2. MySQL 入门(2):索引

    摘要 在这篇文章中,我会先介绍一下什么是索引,索引有什么作用. 之后会介绍一下索引的数据结构是什么样的,有什么优点,又会带来什么样的问题. 在分析完数据结构后,我们可以根据这个数据结构,研究索引的用法 ...

  3. redis系列之2----详细讲解redis数据结构(内存模型)以及常用命令

    Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...

  4. P4016 负载平衡问题 网络流重温

    P4016 负载平衡问题 这个题目现在第二次做,感觉没有这么简单,可能是我太久没有写这种题目了,基本上都忘记了,所以我连这个是费用流都没有看出来. 有点小伤心,知道是费用流之后,我居然还拆点了. 这个 ...

  5. SSM家庭财务管理系统

    包含[项目源码+论文]:http://mp.toutiao.com/preview_article/?pgc_id=6805534721838154254

  6. 物流配送中心管理系统(SSM+MYSQL)

    工程项目视频观看地址:www.toutiao.com/i6804066711… 本文首先对系统所涉及到的基础理论知识进行阐述,并在此基础上进行了系统分析.系统分析是平台开发的一个不可缺少的环节,为了能 ...

  7. 设计模式之GOF23状态模式

    状态模式state 场景:当具有许多状态并且需要频繁改变时,用这种模式 -电梯的运行:维修,正常,自动关门,自动开门,向上运行,向下运行,消防状态 -红绿灯:红灯,黄灯,绿灯 -企业或政府系统:公文的 ...

  8. ereg正则%00截断

    0x01 <?php $flag = "xxx"; if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9] ...

  9. php_rce

    0x01 PHP_RCE RCE(remote command/code execute):远程命令/代码执行 此题为ThinkPHP V5远程代码执行漏洞 0x02 命令执行 http://124. ...

  10. jquery-----ajax的几种方法

    $.get(url,function(data,status){ if(status == 'success'){ layer.msg(data,{shift:1,time:2000},functio ...