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. IBM Rational Rose软件下载以及全破解方法

    最近忙着作业,软件设计的类图着实难画,于是整理了rose的下载和破解方法 Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具.用于可视化建模和公司级水平软 ...

  2. Java——运算符那些事

    && 逻辑与 &&先运算&&左边的算式,如果为假,则直接停止,后面不管有多少运算式都不再运算,如果为真则继续判断后面的式子,只有所有的条件全部成立,才会 ...

  3. Java:手写幼儿园级线程安全LRU缓存X探究影响命中率的因素

    最近遇到一个需求,需要频繁访问数据库,但是访问的内容只是 id + 名称 这样的简单键值对. 频繁的访问数据库,网络上和内存上都会给数据库服务器带来不小负担. 于是打算写一个简单的LRU缓存来缓存这样 ...

  4. 网络流 O - Marriage Match IV

    题目链接:https://vjudge.net/contest/299467#problem/O 题目思路:网络流+最短路 这个是一个最短路+最大流,最短路容易,就是跑起点到每一个点的距离. 但是这个 ...

  5. Coursera课程笔记----Write Professional Emails in English----Week 4

    Request and Apology Emails(Week 4) How to Write Request Emails Write more POLITELY & SINCERELUY ...

  6. Day_14【IO流】扩展案例2_缓冲字符输出、输入流进行用户名的创建

    需求分析 1.项目根目录下建立文件: user.txt,文件中存放用户名和登录密码,格式:用户名,密码,如:aaa,123: 2.user.txt文件中初始存放的用户信息有如下: jack,123 r ...

  7. 解决MySQL 8.0数据库出现乱码的问题

    1.在MySQL 8.0的安装目录下创建一个my.ini文件(保存为utf8格式),然后写入以下内容: [mysql] # 设置mysql客户端默认编码 default-character-set=u ...

  8. STM32 标准库V3.5启动文件startup_stm32f10xxx.s分析

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 前言 分析startu ...

  9. Spring方法注入的使用与实现原理

    一.前言   这几天为了更详细地了解Spring,我开始阅读Spring的官方文档.说实话,之前很少阅读官方文档,就算是读,也是读别人翻译好的.但是最近由于准备春招,需要了解很多知识点的细节,网上几乎 ...

  10. vue v-for 渲染input 输入有问题 解决方案

    v-for循环input标签的时候输入信息两个输入框一同显示输入信息 解决方案: <input :placeholder="items.title" v-model = &q ...