`

GC与引用记数

 
阅读更多
根(Root)就是判断对象是否可被引用的起始点。至于哪里才是根,不同的语言和编译器都有不同的规定,但基本上是将变量和运行栈空间作为根。

GC的三种基本方式
1.标记清除:从根开始将可能被引用的对象用递归的方式进行标记,然后将没有标记到的对象作为垃圾进行回收。
1.1标记压缩(标记清除的变形):将标记的对象不断压缩

标记清除有一个缺点:分配了大量对象,并且其中只有一小部分存活的情况下,所消耗的时间会大大超过必要的值,这是因为在清除阶段还需要对大量死亡对象进行扫描。

2.复制收集:从根开始被引用的对象复制到另外的空间中,然后,再将复制的对象所能够引用的对象用递归的方式不断复制下去。

3.引用计数:是GC算法中最简单也最容易实现的一种,它和标记清除方式差不多是在同一时间发明出来的。它的基本原理是在每个对象中保存该对象的引用计数,当引用发生增减时对计数进行更新。

引用计数的增减,一般发生在变量赋值,对象内容更新,函数结束等时间点。当一个对象的引用计数变为0时,则说明它将来不会再被引用,因此可以释放相应的内存空间。

引用计数的优点:
1.容易实现
2.当对象不再被引用的瞬间就会被释放
3.由于释放操作是针对每个对象个别执行的,由GC产生的中断时间比较短

缺点:
1.最大的的缺点是无法释放循环引用的对象,如A引用B,B引用C,C引用……
2.必须在引用发生增减时对引用计数做出正确的增减,如果漏掉某个增减的话就会引发很难找的内存错误,如果忘记增加的话,会对不恰当的对象进行释放;而忘记减少的话,对象会一直残留内存中,从而导致内存泄漏。
3.不适合并行处理。如果多个线程同时对引用计数进行增减的话,引用计数的值就可能产生不一致的问题。为了避免这种情况的发生,对引用计数的操作必须采用独占的方式来进行。如果引用操作频繁发生,每次都要使用加锁等并发控制机会,这样带来的开销也不小。
分享到:
评论

相关推荐

    gc.rar_gc

    引用计数是一种常见的垃圾回收策略,其基本思想是为每个对象维护一个引用计数,记录该对象被多少个其他对象所引用。当一个对象的引用计数变为0时,表明没有其他对象指向它,可以推断此对象不再被使用,垃圾收集器就...

    luarc-5.1:Lua5.1的引用计数版本

    #Luarc-5.1 在 Lua 5.1.4 中实现的引用计数内存管理和 Mark/Sweep GC 的实现。 #执行使用纯引用计数实现,即一旦引用计数变为 0,堆对象将被回收,不使用延迟释放。 是的,由于引用计数更新,更多的cpu周期用于参数...

    delphi接口计数

    3. 引用计数与垃圾回收 在Delphi中,对象的生命周期由其引用计数决定。当对象的引用计数下降到0,除了通过接口引用的对象外,GC会判断这个对象是否还有其他引用。如果没有,GC会释放该对象占用的内存。这与C#或Java...

    Java GC的过程

    1. 引用计数法:跟踪对象被引用的次数,当引用计数为0时,认为对象可回收。但由于其无法处理循环引用,Java并未采用。 2. 可达性分析:通过一系列称为“根”(如:本地方法栈中的JNI引用,运行时常量池的静态引用,...

    java垃圾回收(gc)机制详解

    GC主要基于两种概念:引用计数和可达性分析。 1. 引用计数:为每个对象维护一个引用计数,当引用数为0时,对象被视为垃圾。但这种方法无法处理循环引用的问题。 2. 可达性分析:从一组称为“根”(如栈上的本地...

    Python引用计数操作示例

    Python的垃圾回收机制除了引用计数外,还有其他策略,比如循环垃圾收集(GC),用于处理那些引用计数无法减少到零但又无用的对象,例如存在循环引用的情况。循环垃圾收集会在特定条件下启动,检查并清理这类循环引用...

    gc.zip_unix c++_垃圾回收器

    gc.c可能包含了垃圾回收器的核心逻辑,如内存分配、引用计数的增加和减少、可达性分析的实现等。而gc.h则可能包含了垃圾回收器的接口定义,供其他C++代码调用。 为了测试和评估垃圾回收器的性能,我们还需要考虑...

    tomcat GC 优化配置

    1. **引用计数(Reference Counting)**:这是一种较早的回收算法,通过增加或减少对象的引用计数来决定是否回收该对象。然而,这种方法无法解决循环引用的问题。 2. **标记-清除(Mark-Sweep)**:此算法分为两个...

    java垃圾回收(gc)机制详解.pdf

    然而,引用计数法存在无法解决对象之间循环引用的问题,即两个对象相互引用,导致它们的引用计数器都大于0,即使这样它们也无法被任何外部对象引用到。 2. 可达性分析法 可达性分析法通过一种称为“GC Roots”的根...

    JVM_GC调优

    1. **引用计数法** - 该方法通过为每个对象添加一个引用计数器来追踪引用的数量。 - 缺点是每次对象赋值都需要更新引用计数器,并且难以处理循环引用的情况。 - 例如,微软的COM、ActionScript 3和Python等都采用...

    JAVA中对GC的理解

    - 引用计数法:每个对象有一个引用计数,当引用计数为0时,对象被视为垃圾。但由于无法处理循环引用,这种方法在现代Java中已不再使用。 - 可达性分析法:从一组称为GC Roots的对象出发,遍历其引用链,无法到达GC...

    gc回收机制

    常见的判断标准有引用计数法、可达性分析等。在可达性分析中,如果一个对象没有任何引用链与GC Roots相连,那么它将被视为垃圾。 3. **垃圾收集**:一旦识别出垃圾对象,GC就会进行垃圾收集,释放这些对象占用的...

    深入解析PHP的引用计数机制

    PHP的变量声明并赋值后,变量名存在符号表中,而值和类信息存在zval中,zval中包含四个变量,is_... /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; };refcount

    24GC实例:Python和Go的内存管理机制是怎样的?1

    引用计数是 Python 内存管理的核心,它跟踪对象被引用的次数,当引用计数变为零时,对象就可以被释放。 Python 使用了自动内存管理技术,包括引用计数和垃圾回收器。引用计数是最基础的策略,每当一个对象的引用...

    深入理解 PHP7 中全新的 zval 容器和引用计数机制

    如果引用计数归零,表明没有其他变量指向该值,垃圾回收机制就会释放内存。 3. **引用(REFERENCE)**:在 PHP7 中,引用不再只是一个标记位,而是一个独立的数据结构 `_zend_reference`。这个结构包含了垃圾收集...

    Golang GC 探究1

    1. 引用计数:每个对象都有一个引用计数,当对象被引用时计数增加,失去引用时减少。当计数为0时,对象被回收。这种方法简单但存在性能问题,因为需要频繁更新计数,并且无法处理循环引用。 2. 标记-清除:从根对象...

    垃圾回收GC经典算法(csdn)————程序.pdf

    引用计数法实现简单,但处理循环引用时效率较低,且无法处理跨进程的引用。 d. 分代式垃圾回收法(Generational GC) 根据对象生命周期的不同,将内存划分为新生代、老年代等区域。新生代的对象存活时间短,GC...

    Php引用计时器和垃圾回收机制[参照].pdf

    然而,这种方法无法处理循环引用的问题,即两个或更多变量相互引用,但没有其他外部引用,导致这些变量的引用计数永远不为0。 为了解决这个问题,从PHP 5.3开始引入了一种更为复杂的垃圾回收机制,称为"标记-清除...

Global site tag (gtag.js) - Google Analytics