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. L - A Heap of Heaps CodeForces - 538F 主席树

    L - A Heap of Heaps CodeForces - 538F 这个是一个还比较裸的静态主席树. 这个题目的意思是把这个数组变成k叉树,然后问构成的树的子树小于等于它的父节点的对数有多少. ...

  2. mybatis添加信息自动生成主键

    一.使用Oracle数据库 举例:添加员工的时候自动生成主键 1.在dao接口中声明方法 2.在mapper中实现该方法 需要先在数据表中创建序列 3.测试 注意:在调用过save方法之后,emp对象 ...

  3. java读源码 之 map源码分析(HashMap,图解)一

    ​ 开篇之前,先说几句题外话,写博客也一年多了,一直没找到一种好的输出方式,博客质量其实也不高,很多时候都是赶着写出来的,最近也思考了很多,以后的博客也会更注重质量,同时也尽量写的不那么生硬,能让大家 ...

  4. c语言中的malloc函数

    少壮不努力,大一的时候c语言学得不扎实,最近学数据结构的时候看到c语言中malloc函数都不知道了,这里记录一下,避免以后再忘. malloc的全称是memory allocation,中文叫动态内存 ...

  5. LeetCode--LinkedList--83.Remove Duplicates from Sorted List(Easy)

    题目地址https://leetcode.com/problems/remove-duplicates-from-sorted-list/ 83. Remove Duplicates from Sor ...

  6. Coursera课程笔记----计算导论与C语言基础----Week 4

    感性认识计算机程序(Week 4) 引入 编程序 = 给计算机设计好运行步骤 程序 = 人们用来告诉计算机应该做什么的东西 问题➡️该告诉计算机什么?用什么形式告诉? 如果要创造一门"程序设 ...

  7. 【Spark】通过创建DataFrame读取不同类型文件内容

    文章目录 读取文本文件 第一种方法:通过RDD配合case class转换DataFrame 步骤 一.创建测试所需的文本文件 二.在spark-shell中执行以下操作 第二种方法:通过sparkS ...

  8. Linux内核驱动学习(九)GPIO外部输入的处理

    文章目录 前言 设备树 两个结构体 gpio_platform_data gpio_demo_device 两种方式 轮询 外部中断 总结 附录 前言 前面是如何操作GPIO进行输出,这里我重新实现了 ...

  9. CodeForces - 1209D Cow and Snacks 并查集

    CodeForces - 1209D 题意 现在n种点心,每种点心只有一份,有k位客人,每位客人有两种想要吃的点心,你可以安排他们进场的顺序,每位客人会吃掉所有他想要吃的,并且还没被吃掉的点心.如果客 ...

  10. [ACdream 1211 Reactor Cooling]无源无汇有上下界的可行流

    题意:无源无汇有上下界的可行流 模型 思路:首先将所有边的容量设为上界减去下界,然后对一个点i,设i的所有入边的下界和为to[i],所有出边的下界和为from[i],令它们的差为dif[i]=to[i ...