iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JVM中四种GC算法案例详解
  • 658
分享到

JVM中四种GC算法案例详解

2024-04-02 19:04:59 658人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍引用计数算法(Reference counting)算法思想:核心思想:优点:缺点:例子如图:标记–清除算法(Mark-Sweep)算法思想:优点缺点例子如图标记–整理算法算

介绍

程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。关于 JVM 的 GC 算法主要有下面四种:

引用计数算法(Reference counting)

算法思想:

每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。

核心思想:

为每个对象额外存储一个计数器 RC ,根据 RC 的值来判断对象是否死亡,从而判断是否执行 GC 操作。

优点:

  • 简单
  • 计算代价分散
  • “幽灵时间”短(幽灵时间指对象死亡到回收的这段时间,处于幽灵状态)

缺点:

  • 不全面(容易漏掉循环引用的对象)
  • 并发支持较弱
  • 占用额外内存空间

例子如图:

初始状态:

初始状态

改变引用后:

这里写图片描述

标记–清除算法(Mark-Sweep)

算法思想:

为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。

优点

  • 最大的优点是,相比于引用计数法,标记—清除算法中每个活着的对象的引用只需要找到一个即可,找到一个就可以判断它为活的。
  • 此外,这个算法相比于引用计数法更全面,在指针操作上也没有太多的花销。更重要的是,这个算法并不移动对象的位置(后面俩算法涉及到移动位置的问题)。

缺点

  • 很长的幽灵时间,判断对象已经死亡,消耗了很多时间,这样从对象死亡到对象被回收之间的时间过长。
  • 每个活着的对象都要在标记阶段遍历一遍;所有对象都要在清除阶段扫描一遍,因此算法复杂度较高。
  • 没有移动对象,导致可能出现很多碎片空间无法利用的情况。

例子如图

这个图中,圆圈内灰色的对象就是已经死亡的对象,被标记为死亡,等待清除。

这里写图片描述

标记–整理算法

算法思想

标记-整理法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。

优点

  • 该算法不会像标记-清除算法那样产生大量的碎片空间。

缺点

  • 如果存活的对象过多,整理阶段将会执行较多复制操作,导致算法效率降低。

例子

如图:

这里写图片描述

上面是标记阶段,下面是整理之后的状态。可以看到,该算法不会产生大量碎片内存空间。

复制算法

算法思想

该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。

注意:

这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。

优点

  • 实现简单
  • 不产生内存碎片

缺点

  • 每次运行,总有一半内存是空的,导致可使用的内存空间只有原来的一半。

总结

不同算法有不同的优点和缺点,除了引用计数法不常用外,其他三种算法在现在的java虚拟机上也是很常见的,间接说明了这几个经典算法还是有其适用性的。

理解 JVM 的 GC 算法能够帮助我们更好地理解java的垃圾回收机制,例如,在 JVM 的年轻代使用的是复制算法来进行垃圾回收(由于其中的存活对象比例较小);而在老年代,使用的却是标记-清除法或标记-整理法(由于每次回收都只回收少量对象)

到此这篇关于JVM中四种GC算法案例详解的文章就介绍到这了,更多相关JVM中四种GC算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JVM中四种GC算法案例详解

本文链接: https://www.lsjlt.com/news/134190.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JVM中四种GC算法案例详解
    目录介绍引用计数算法(Reference counting)算法思想:核心思想:优点:缺点:例子如图:标记–清除算法(Mark-Sweep)算法思想:优点缺点例子如图标记–整理算法算...
    99+
    2024-04-02
  • JVM的四种GC算法分别是什么
    本篇文章给大家分享的是有关JVM的四种GC算法分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内...
    99+
    2023-06-02
  • 详解JVM中的GC调优
    目录那些GC的默认值GC的选择GC的最大线程个数初始化heap size最大的heap size分层编译技术我们到底要什么最大暂停时间吞吐率那些GC的默认值 其实GC或者说JVM的参...
    99+
    2024-04-02
  • Java开启线程的四种方法案例详解
    目录1、继承Thread类1.1 代码实现1.2 测试结果2、实现Runnable接口2.1 方式一:直接实现Runnable接口2.1.1 代码实现2.1.2 测试结果2.2 方式...
    99+
    2023-02-16
    java开启线程 java开启线程四种方法 java开启线程方式
  • Java jvm中Code Cache案例详解
    Code Cache JVM生成的native code存放的内存空间称之为Code Cache;JIT编译、JNI等都会编译代码到native code,其中JIT生成的nativ...
    99+
    2024-04-02
  • java基础之JVM中GC算法怎么用
    这篇文章主要介绍了java基础之JVM中GC算法怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JVM内存组成结构:(1)堆所有通过new创建的对象都是在堆中分配内存,其...
    99+
    2023-05-30
    java jvm gc
  • Java DFA算法案例详解
    1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: 直接将敏感词组织成String后,利用indexOf方法来查询。 传统的敏感词入库后SQL查询。 ...
    99+
    2024-04-02
  • Java强制保留两位小数的四种方法案例详解
    方法一:String的format方法(推荐) double f = 111231.5585; System.out.println(String.format("%.2f",...
    99+
    2024-04-02
  • Java JVM编译策略案例详解
    解释器 当虚拟机启动时,解释器可以首先发挥作用,而不必等待编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。并且随着程序运行时间的推移,编译器逐渐发挥作用,根据热点探测功能...
    99+
    2024-04-02
  • Java中四种引用详解
    目录强引用软引用弱引用虚引用总结java 中的 4 种引用方式,适用于不同的场景,重点需要理解虚引用,结合文字和代码 强引用 被强引用的对象,不会被垃圾回收器回收,JVM 宁愿抛出 ...
    99+
    2024-04-02
  • Dijkstra算法与Prim算法的异同案例详解
    目录Dijkstra简述Prim简述异同思想时间复杂度Dijkstra特例Dijkstra简述 Dijkstra算法用于构建单源点的最短路径树(MST)——即树中某个点到任何其他点的...
    99+
    2024-04-02
  • Java虚拟机中GC算法和种类是什么
    这篇文章主要介绍了Java虚拟机中GC算法和种类是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、GC的概念:GC:Garbage Collection 垃圾收集196...
    99+
    2023-06-17
  • Python 经典贪心算法之Prim算法案例详解
    最小生成树的Prim算法也是贪心算法的一大经典应用。Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树。 Prim算法过程: 一条边一条边地加, 维护一棵树。 初...
    99+
    2024-04-02
  • Java中四种线程池的使用示例详解
    在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大使用线程池的好处: 减少在创建和销毁线程上所花的时间以及系统资源的开销 如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 本文详细的给...
    99+
    2023-05-31
    java 线程池 ava
  • Android中点击事件的四种写法详解
    Android中点击事件的四种写法 使用内部类实现点击事件 使用匿名内部类实现点击事件 让MainActivity实现View.OnClickListener接口 通过布局文件中控件的属性 第一种方法:使用内部类基本步骤如下: 新...
    99+
    2023-05-31
    android 点击事件 roi
  • JS中switch的四种写法示例
    目录引言switch一般写法switch简单写法IIFE 封装封成策略引言 JavaScript 的 switch 有四样写法,你知道么?不管你知道不知道,反正我是不知道。 我所知道...
    99+
    2024-04-02
  • Java中ArrayList初始化的四种方法详解
    目录1 起因2 解决方案2.1 双括号法2.2 Arrays.asList2.3 stream2.4 Lists3 总结1 起因 在实际业务开发中, 我们经常会遇到需要临时创建一个数...
    99+
    2024-04-02
  • 最新JVM垃圾回收算法详解
    目录1.垃圾回收需要做什么2.如何判断对象可被回收2.1 引用计数算法2.1.2 优点2.1.2 缺点2.2 可达性分析算法2.2.1 算法思路2.2.2 GC Roots对象(两栈...
    99+
    2024-04-02
  • jvm垃圾回收算法详细解析
    目录前言几种常用的垃圾回收算法1、引用计数法2、根搜索算法3、标记清除法(Mark-Sweep)4、复制交换算法(Mark-Sweep)5、标记压缩算法(Mark-Compact)J...
    99+
    2024-04-02
  • Spring实例化bean的四种方式详解
    目录一、bean实例化——构造方法(常用)二、bean实例化——静态工厂(了解)三、bean实例化——实例工厂...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作