对象是否有被引用判断及垃圾收集算法

1、引用计数算法

  给对象中添加一个计数器,每当一个地方引用它时,计数器值就加1;当引用失效时就减1。如果两个对象存在相互的引用,尽管这两个引用已经不再被使用,但还是不能被清除。通过一些实验可得SUN公司的JVM没有采用这种算法。

2、根搜索算法

  该算法的基本思路是通过一系列的名为“GCRoots” 的对象作为起点,从这些起点开始向下搜索。搜索所通过的路径(引用链:Reference chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。在JAVA里可用做GC Roots的对象有:虚拟机栈中的引用对象、方法区中的类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(一般说的Native method)引用的对象

垃圾收集算法:

1、标记-清除算法(mark-sweep)

  这是最基础的算法,在内存中判断对象还有没有被引用,如果没有则被标记,最后被清除,该算法会在后面的算法中使用。

  缺点:a 标记、清除效率不高。

        b 清除后会产生大量不连续的碎片,在分配较大的对象时可能因为找不到合适的完整的内存区域,而进行第二次垃圾收集。

2、复制算法(copying)

  是指把内存区域一分为二,在第一块区域中的存活对象搬迁到第二块区域中,然后前一块一次清理掉,迁移只需要移动堆指针。简单高效。

  缺点:把内存降为原来的一半。

  实际的商业运用中,比例不一定是1:1,他会根据内存中的特征来设计合适的比例。 比如:HotSpot虚拟机默认的Eden与Survivor的空间为8:1(内存会被分为一个Eden和两个Survivor,只使用Eden和其中一个Survivor),所以使用了90%的空间。如果其他场景内存不够够则会需要使用其他内存来进行担保。

3、标记-整理算法

  是指把所有存活的对象向一端移动,然后直接清楚掉端边界面以外的内存。

4、分代收集算法

  是指跟据不同的特点,把它们分到不同的区域。一般是把Java堆分为新生代和老年代,这样就可以根据期特点,使用不同的算法收集。新生代在收集时会有大批对象死亡从而可以采用复制算法,老年代的对象存活率比较高,则可以使用标记-清理算法或标记-整理算法。

时间: 2024-10-12 23:34:27

对象是否有被引用判断及垃圾收集算法的相关文章

javaVM 判断对象实例何时回收 用的可达性分析算法,而非引用计数算法

做java开发也好几年了,今天才晓得java内存的回收算法,真是惭愧惭愧 java虚拟机判断一个对象实例是否可以被回收,并非引用计数算法. 因为引用计数算法很难解决对象直接互相循环引用的问题. 所以java C#都是使用可达性分析来判断对象是否可以回收的. 这个算法的基本思路就是通过一系列的称为"GC Root"的对象作为起始点,从这些节点开始向下搜素,搜索所走过的路径称为应用链,当一个对象到GC Roots没有任何引用链相连时.则证明此对象时不可用的,可以被回收了.如下图对象obje

JVM【第十回】:【判断对象已死之引用计数算法】

很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用.很多应届生和一些有多年工作经验的开发人员,他们对于这个问题给予的都是这个答案. 客观地说,引用计数算法的实现建安,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软COM(Component Object Model)技术.使用ActionScript3的FlashPlayer

【JVM】JVM垃圾收集器、垃圾收集算法、无用对象

Java 常见的垃圾收集器有哪些 实际上,垃圾收集器(GC,Garbage Collector)是和具体 JVM 实现紧密相关的,不同厂商(IBM.Oracle),不同版本的JVM,提供的选择也不同.接下来,我来谈谈最主流的 Oracle JDK. Serial GC 它是最古老的垃圾收集器,"Serial"体现在其收集工作是单线程的,并且在进 行垃圾收集过程中,会进入臭名昭著的"Stop-The-World"状态.当然,其单线程设计也意味着精简的 GC 实现,无需

Java虚拟机对象存活标记及垃圾收集算法解析

一.对象存活标记 1. 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 引用计数算法(Reference Counting)的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM(Component Object Model)技术.使用ActionScript 3的FlashPlayer.Python语言以及在游戏脚本领域中被广泛应用

跟着百度学PHP[4]OOP面对对象编程-5-内部引用$this

$this就是对象内部代表这个对象的引用 可以调用被封装的方法或者属性! <?php class Person{ private $name; private $age="21"; var $sex; function play(){ echo "他正在玩儿呢"; } private function Hello(){ //使用private封装hello方法.该方法不可直接调用.但是可以在内部使用$this调用. echo "这个是被封装的内容&q

Python3标准库:weakref对象的非永久引用

1. weakref对象的非永久引用 weakref模块支持对象的弱引用.正常的引用会增加对象的引用数,并避免它被垃圾回收.但结果并不总是如期望中的那样,比如有时可能会出现一个循环引用,或者有时需要内存时可能要删除对象的缓存.弱引用(weak reference)是一个不能避免对象被自动清理的对象句柄. 1.1 引用 对象的弱引用要通过ref类来管理.要获取原对象,可以调用引用对象. import weakref class ExpensiveObject: def __del__(self):

【Java 之 JVM】垃圾收集算法

一.判断对象是否存活--可达性分析算法 基本思想:通过一系列成为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots 没有任何引用相连则证明该对象是不可用的.在判断完无链之后,还需经历两次标记过程,才会真正回收,暂略. 二.垃圾收集算法 1.标记--清除算法 标记出所有需要回收的对象,标记完统一回收.缺点:标记,清除2个过程效率都不高,大量不连续的内存碎片. 2.复制算法 将内存划分为大

垃圾收集与几种常用的垃圾收集算法

前言: 首先思考垃圾收集(Garbage Collection,GC)需要完成的三件事情 1)哪些内存需要回收? 2)什么时候回收? 3)如何回收? 再上一个博客中提到了Java内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈3个区域会随着线程而生,随线程而灭:栈中的栈帧随着方法的进行有条不紊地执行着出栈和入栈操作.每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知得,因此这几个区域的内存分配回收都具备确定性,在这几个区域就不需要过多的考虑回收的问题,因为在方法结束或线程结束

GC垃圾收集算法

GC判断对象是否存活算法 1> 引用计数算法 2> 根搜索算法(GC Root) GC垃圾收集算法 1> 标记清除算法(Mark-Sweep):分为标记和清除两个阶段,首先标记出可以回收的对象,标记完后统一回收.缺点如下: a) 效率低:标记和清除过程效率都不高: b) 空间问题:清除之后产生大量不连续的内存碎片. 2> 复制算法(Copying):将内存划分成大小相等的两块,每次只使用其中的一块,当需要清理时,就直接将存活的对象复制到另一块.这种方式实现简单效率高,也不会存在碎片