java垃圾回收的三种算法

STM32CubMX_MQ135检测空气质量 一、MQ135简介 MQ135是测量空气污染情况常用的一个传感器,具有代表性,价格低,寿命长,敏感度也OK,主要用于测量空气中二氧化碳,氮氧化物,氨气,酒精,苯类等。这几样气体可以说都属于家用空气污染测定中的重要成份,因此用这个传感器刚刚好。 MQ135气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在污染气体时,传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。 注: pm2.5的话要用另外类型 阅读详情

java垃圾回收的三种算法

为什么需要垃圾回收:
在程序执行的过程中,会产生一系列的对象(占用内存的代表),这些都会存储在内存中。一部分对象在生命周期结束后,依然会占用一部分内存。这些占用内存却没有再次使用的对象,我们称之为“垃圾”,而对“垃圾”占用的内存的回收,就是垃圾回收。

在没有垃圾回收机制的语言里,垃圾回收操作需要程序猿来完成,这常常会导致错误。

内存泄漏:忘记释放一部分内存,导致那一部分内存不可用,并且占用着总的内存空间,如果这种情况一直存在着,那么就可能导致内存空间被占满,系统崩溃。

垂直指针:忘记初始化指向释放了内存的指针(指向曾经存在的对象,但是对象已经不存在了),当再次调用指针的时候,指针指向了空内存,引起bug

释放错误的内存:人为的操作难免会发生错误,如果释放了错误的内存,也会导致程序发生莫名其妙的bug

三种垃圾回收算法:
(1)标记清除法:分为两步(标记和清除)
标记阶段:遍历所有的对象,在活动的对象头打上活动的标记
清除阶段:再次遍历对象,检查对象头,对于没有活动标记的对象,将其内存空间释放;对于有活动标记的对象,去掉标记

优点:算法简单,实现简单
缺点:
碎片化:由于只是将垃圾对象清除掉,对于存活对象不做处理,所以由于存活对象分布的不连续性,会导致可用内存被分割成一块块的。如果有一个新的对象请求内存,需要去内存中寻找,哪一个空闲块(可用一个链表来维护空闲块的位置)足够满足这个对象的需求。更极端的情况,空闲的总内存大于对象请求的空间,却没有足够的连续空闲空间,来完成内存的分配
与写时复制技术不兼容:写时复制(Copy On Write)是一个很重要的思想,可以优化内存占用或者提升并发环境下的性能。顾名思义,这一技术是在有写入的时候,对内存进行复制,以达到一定的优化目的。而标记清除算法的标记过程,就是一次对内存(对象头)的写入,会不断地引起内存复制。因此标记清除算法与此技术并不互相兼容

(2)引用计数:垃圾回收关注的是对于不会再次被使用的对象的内存回收,换一种说法,对于会被垃圾回收清理的对象(内存),不会再次的被其他对象引用。那么可以为每一个对象引入一个计数器,对于任意一个对象,每有一次对这个对象的引用,就将计数器加1;结束对这个对象的引用,再将计数器减1;一旦计数器归0,则表示这个对象可以被清除。这就是引用计数法
缺点:
占用资源:因为每个对象都需要维护一个计数器,每次指针有更新都伴随着计数器的更新,一定程度上占用了计算资源
占用内存:计数器需要占用一定的内存,为了安全起见,计数器值的上限要大于所有对象的上限,这也是一笔不小的开销
实现复杂:虽然引用计数的思想简单,但是实现起来却不那么容易。各位可以思考下,如果自己编写这一算法,该如何实现?
无法解决循环计数

(3)复制算法
在复制算法中,先将内存分为两个部分,From区和To区,两部分大小相等。对象分配时,只会在From区进行分配。复制算法可以分两步,第一步为类似标记清除算法的标记,在From区中,找出所有活动的对象。区别在于第二步。复制算法会把这些活动的对象,复制到To区中,再将原有的From区全部清空,并交换两部分内存的职责,即一次GC后,原有的From区会成为To区,To区相反

效率快:相比于标记清除算法,复制算法在标记阶段,只需要标记哪些对象是活动的就可以了,相比于标记清除算法需要遍历所有的对象,性能上有提升

不会发生碎片化:同样相比于标记清除算法,由于存活下来的对象会在To区中连续的分配,因此不会像标记清除算法那样,需要维护碎片空间

分配速度快:由于不会发生碎片化,如果有一个新的对象请求内存,那么分配时可以直接追加在From区已用内存之后,分配的速度快

内存使用率低:由于复制算法把内存分成了两块,那么对于对象的可用空间来说,仅仅是其他算法的一半

自对象的递归复制:一个对象通常会关联一些自对象。在复制这些对象的时候,还需要递归的去处理它的自对象,这通常会产生一定的开销。同时,在递归调用时,存在着函数栈的消耗,潜藏着栈溢出的风险

LLVM 编译器学习笔记之三十六-- 指令调度Instruction scheduling 1、参考Instruction scheduling in LLVM - 知乎,在中后端均存在指令调度 指令调度模型 2、在llvm12->llvm14 中Machine Instruction Scheduler有个patch增强了load/store指令的合并,也就是指令调度不仅仅只是改变指令的顺序,该优化类似gcc中的store-merge优化 ..................................................................... 阅读详情

相关推荐

STM32 SYSTICK定时器及延时函数详解

STM32 SYSTICK及延时函数详解 SysTick定时器 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心

w1050321758的博客 2368

Java的垃圾回收机制

本篇文章主要整理一下自己学习和了解到的关于Java垃圾回收机制的一些知识。欢迎各位Coder交流。

qq_40413725的博客 9686

grpc安装与简单demo测试

grpc安装: 由于工作需要,最近在学google的rpc开源框架;由于本人菜鸟一枚,而且是从Windows开发转到Linux;由于之前版本控制使用的是svn,没有使用过git,所以从GitHub上下载代码是通过浏览器下载zip格式的压缩文件,折腾了好几天了,发现了各种坑,各种缺少库,各种不知道怎么把这个库给装机器上。对于一个不熟悉Linux的人来说,这个体验简直糟糕透了。没办法了又在机器上装了...

old__captain的博客 4833

【Java】垃圾回收

1、垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。外文:An object is considered garbage when it can no longer be reached from any pointer in the running program.2、如果不及时对内存中的垃圾进行清理,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。......

X_xiaojuzi的博客 5084

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略

本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。

weixin_42535461的博客 3157

fMRI数据处理:从DICOM到NIFTI(上)

哈喽,这里是系列fMRI数据处理文章专栏。包括从核磁拷贝完DICOM格式的文件,到整理数据,检查数据,数据预处理,后续分析等等内容。如果你是一个初学者,特别是心理学或者是刚踏入认知神经科学的小白,那么这个专栏可以帮助你从头到尾完成数据处理直到结果的可视化。如果你已经进入了认知神经科学领域,这里面的内容可能过于细致,并且找不到你想要的答案,不过可以在帖子下留言评论,欢迎大家提供宝贵的意见!如果是医学相关,可能这些内不太准确或专业,谨慎参考!

weixin_44933894的博客 2482

【JVM】万字长文!深入详解Java垃圾回收(GC)机制

如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。

陈宝子的博客 6705

华为CNA VRM搭建(使用vmware worfstartion搭建)

华为CNA和VRM在 vmware workstation安装使用

weixin_70595351的博客 1813

Java的垃圾回收机制详解

C语言垃圾回收Java语言垃圾回收。

qq_41946216的博客 4456

cut&tag学习笔记

上图是我得到的结果,下图是教程的结果,比对结果有一些差异,我也不知道具体原因是啥。谷歌了一下,发现原因可能是因为环境变量的问题,系统不知道picard的具体位置,需要设置全局环境变量,遂查了一下picard的位置。我发现我做出来的结果测序深度一致,但是比对的结果有一点差异,不知道是我的操作问题,还是参考基因组更新了导致比对结果出现了些许不同。上图是我得到的结果,下图是教程的结果,除了IgG_rep1外比对结果一致。上图是我的结果,下图是教程的结果,结果不太一致,不知道是具体的原因是什么。

weixin_52073820的博客 2423

基于OpenCV实现暗通道先验去雾算法及改进,效果惊人

深度技术文,前方高能

公号:一条coding 2万+

java的垃圾回收(GC)详解

Java 堆(Java Heap)是JVM所管理的内存中最大的一块,堆又是垃圾收集器管理的 主要区域,这里我们主要分析一下 Java 堆的结构: Java 堆主要分为2个区域-新生代与老年代(java1.8之后),其中新生代又分 Eden 区和 Survivor 区,其中 Survivor 区又分 From 和 To 2个区。如果该对象被引用,则它的引用计数加 1,如果删除对该对象的引用,那么它的引用计数就减1,当该对象的引用计数为0 时,那么该对象就会被回收。为了实例的快速分配,需要进行碎片整理。

m0_74674329的博客 2264

静态时序分析(STA)—— 标准单元库

目录 1、时序库 概览 2、时序模型 1、基本概念 2、影响因素 3、线性延时模型 4、非线性延时模型 5、单元时序弧 1、组合逻辑单元 2、时序逻辑单元 6、线负载模型 参考说明 上一篇,学习了 STA相关的基本概念,本篇继续学习 STA相关的 标准单元库。 1、时序库 概览 库文件概览: 2、时序模型 1、基本概念 2、影响因素 对于组合逻辑的时序弧而言,其延时的大小取决于: 1、输出负载,即,输出端的电容负载的大小。容性负载越大,...

记录所学,分享知识,结识挚友 2855

Java 三种垃圾回收算法与七种垃圾收集器

对Java 中垃圾回收相关知识,予以记录!JVM调优之垃圾定位、垃圾回收算法、垃圾处理器对比。

qq_43357394的博客 1593

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java垃圾回收机制的三种回收算法图解

JVM内存中有五大模块:堆,方法区,栈,本地方法栈,程序计数器。而垃圾回收机制只存在于堆和方法区中,且绝大部分在堆中。

weixin_44580398的博客 666

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java垃圾回收算法(标记清除、复制、标记整理)详解

不同的垃圾回收算法适用于不同的场景。标记清除算法简单但会产生内存碎片;复制算法能避免碎片但浪费内存;标记整理算法综合了两者的优点,但存在移动对象的性能开销。在实际的Java虚拟机中,往往会根据不同的堆区域(如新生代、老年代)的特点,组合使用这些算法,以达到最佳的垃圾回收效果。

dsq_MaDing的博客 1227

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为面试官问我:你真的明白Java垃圾回收器吗?我生气了!!(︶︿︶)

第一阶段:串行垃圾回收器:jdk1.3.1之前Java虚拟机仅仅只支持Serial收集器 第二阶段:并行垃圾回收器:随着多核的出现,Java引入了并行垃圾回收器,充分利用多核性能提升垃圾回收效率 第三阶段:并发标记清理回收器CMS:垃圾回收器可以和应用程序同时运行,降低暂停用户线程执行的时间 第四阶段:G1(并发)回收器:初衷是在清理非常大的堆空间的时候能满足特定的暂停应用程序的时间,与CMS相比会有更少的内存碎片【资料获取】 1 垃圾回收算法 1-1 标记清除算法 算法概述 优点:回收速度快 ..

wj1314250的博客 1万+

JVM垃圾回收算法和垃圾回收器

垃圾回收算法, 垃圾回收器

dandandeshijie的博客 646

Java垃圾回收算法详解

1 概述 在前一篇文章中讲到了Java虚拟机的基础知识和运行时数据区的划分,在运行时数据区的划分中,可分为线程共享区域和线程私有区域,而Java的垃圾回收就发生在线程共享区域中,更直观的说法就是Java的垃圾回收大部分都发生在Java的堆(Heap)区域内。 1.1 哪些对象需要回收 在了解了Java垃圾回收主要发生在哪些区域之后,然后我们就需要知道在Java中哪些对象是需要被当做垃圾回收的,这是一个很简单的问题,既然是需要回收的,那肯定就是在程序中已经使用过且后续不会再用到的对象,那怎么判断一个对象是否还

CodeJR 2072

JVM垃圾回收算法与垃圾回收器

垃圾回收算法(三种) 我们知道,怎样判断一个对象是否是垃圾,主要是看它是否GC Root 对象所引用。大家可以看一下Java中的四种引用 如果未被GC Root对象所引用,那么看它是哪种引用,判断是否需要垃圾回收。我们看到上图中被GC Root实线连接都是不用被垃圾回收的。而未被GC Root直接连接的就是需要可能被垃圾回收。这时怎样去垃圾回收需要一种方法,这就需要垃圾回收算法。 标记清除 我们看到上图中被GC Root实线连接都是不用被垃圾回收的。而未被GC Root直接连接的就是需要可能被垃圾回收。

qq_42411214的博客 455

GC垃圾回收(1)- 回收算法与分代模型

1. 什么是garbage垃圾? 没有任何引用指向的一个对象或者多个对象(循环引用),就是垃圾 1.1 Java与C++对于垃圾处理的区别 Java GC处理垃圾 开发效率高,执行效率低 C++ 手动处理垃圾 忘记回收 -> 会导致内存泄漏 回收多次 -> 会造成非法访问 开发效率低,执行效率高 2. 怎么定位垃圾 Java堆中存放着几乎所有的对象实例,垃圾回收器在堆进行垃圾回收前,首先要判断这些对象那些还存活,哪些成为了”垃圾“。定位“垃圾”有如下算法: (1)引用计数法(Referenc

qq_44503377的博客 674

JVM垃圾回收相关算法-垃圾标记阶段

JVM垃圾回收相关算法-垃圾标记阶段

小草的博客 387

四、分代垃圾回收机制及垃圾回收算法

自动化的垃圾回收机制回收区域:堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,回收 class,常量,静态常量,字符串常量池CMS 问题比较多,所以现在没有一个版本默认是 CMS,只能手工指定。但是它毕竟是第一个并发垃圾回收器,对于了解并发垃圾回收具有一定意义,所以我们必须了解。

空杯 1997

Java虚拟机的垃圾回收机制

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:523047986 我们一起学Java! Java...

chuifuhuo6864的博客 453

垃圾回收算法有哪些?

说到 Java 虚拟机不得不提的一个词就是 “垃圾回收”(GC,Garbage Collection),而垃圾回收的执行速度则影响着整个程序的执行效率,所以我们需要知道更多关于垃圾回收的具体执行细节,以便为我们选择合适的垃圾回收器提供理论支持。 如何判断一个对象是否“死亡”?垃圾回收的算法有哪些? 典型回答 垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。 判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法和可达性分析算法。 引用计数

Andrew.J 1475

Java 垃圾回收算法详解

Java的内存管理是其强大功能之一,而垃圾回收(Garbage Collection, GC)是确保内存不会被无用对象占用的关键机制。本文将详细介绍三种常见的垃圾回收算法:标记-清除、复制、标记-整理,并通过代码示例展示这些算法的具体应用。

weixin_53840353的博客 1222
上一篇: Java的动态绑定那些事
下一篇: Java堆和Native堆
DanLongChen
博客等级 码龄9年 13粉丝 54原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值