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. js 箭头函数不适用的场景

    箭头函数虽然方便但也不是每个地方都适用, 箭头函数在开发中可以十分方便的干预 this的指向,在一些情况下,是不需要对this的指向进行干预的,也就不适用箭头函数 1.构造函数的原型方法上 例如:Pe ...

  2. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

  3. B. Phoenix and Beauty(贪心构造)

    \(给定序列长n的数组和k.完美数组的定义是数组中每一个连续k项的子段和为定值\) \(现在要求插入一些数使得数组满足条件,输出你构造的新数列.\) \(\color{Red}{----------- ...

  4. Spring JDBC 框架使用JdbcTemplate 类的一个实例

    JDBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等.但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQ ...

  5. Redis学习笔记(三) 字典

    Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对. redis字典所用的哈希表由disht结构定义. typedef struct d ...

  6. Mysql常用sql语句(13)- having 过滤分组结果集

    测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html 前言 ...

  7. R语言:计算现金工资的币数

    新入职的员工,有的没有相应银行卡,需要计算现金工资的币数.实发工资,一般取整数. 简化计算,纸币面值只有100.10.1.4278除以100等于42余78,78除以10等于7余8,8除以1等于8. 复 ...

  8. java 8 stream、lambda表达式对list操作分组、过滤、求和、最值、排序、去重

    1.分组 通过groupingBy分组指定字段 list.stream().collect(Collectors.groupingBy(User::getSex)); 2.过滤 通过filter方法过 ...

  9. 到手的DEM不会用?教你6个常用强大功能

    一.概述 DEM是数字高程模型(Digital Elevation Model)的简称,接触GIS,规划,设计类的多多少少会接触到DEM,可是这个直接查看黑溜溜一片DEM到底可以用来做什么呢? 二.背 ...

  10. react-grid-layout实现拖拽,网格布局

    借鉴地址:https://www.jianshu.com/p/b48858eee3a7 安装 react-grid-layout npm install react-grid-layout impor ...