学习-垃圾收集算法

垃圾收集算法

1、标记-清除算法
首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。缺点:

  • 效率问题,标记和清除过程的效率都不高;
  • 标记清除之后会产生大量不连续的内存碎片;

2、复制算法
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。缺点:

  • 将内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低。

3、标记-压缩算法
标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

4、分代收集算法
把Java堆分为新生代老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

原文地址:https://www.cnblogs.com/zd-blogs/p/12015844.html

时间: 2024-10-13 12:34:26

学习-垃圾收集算法的相关文章

Java虚拟机学习 - 垃圾收集算法(3)

跟踪收集器 跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC  Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC  Roots 没有任         何引用链时,则证明此对象是不可用的. 下图中,对象Object6.Object7.Object8虽然互相引用,但他们的GC Roots是不可到达的,所以它们将会被判定为是可回收的对象. 可作为GC Roots 的对象包括: 虚拟机栈(栈帧中的本地变量表)中的引用对象. 方法区中的

J深入学习ava虚拟机之——垃圾收集算法与垃圾收集器

今天我们将一起学习Java虚拟机使用垃圾收集算法和常见的垃圾收集器.Java虚拟机内存区域的程序计数器.虚拟机栈和本地方法栈3个区域是随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出出栈和入栈.每一个栈帧中分配多少内存基本上是在类结构确定下来的时候就已知的,因此这个几个区域的内存分配和回收都具备确定性,在这几个区域就不需要过多考虑回收问题,因为方法结束或者线程结束时,内存自然就跟着回收了.而Java堆和方法区就不一样,一个接口中的多个类实现需要的内存可能不一样,一个方法中的多个分支需要的内

大话JVM(一):垃圾收集算法

 系列介绍|本系列主要是记录学习jvm过程中觉得重要的内容,方便以后复习 在说垃圾收集算法之前,先要说一下垃圾收集,从大的讲,垃圾收集需要考虑三件事情: 1.哪些内存需要回收 2.什么时候回收 3.如何回收 JVM在执行java程序时,把他管理的内存分为多个数据区域: 1.程序计数器(记录程序执行到哪了,各线程之间独立存储, 互不影响) 2.虚拟机栈(这个栈就是我们常说的jvm的“堆”和“栈”中的栈,这里存放的是编译期间可知的各种数据类型(8种基本类型).对象引用(reference类型,就是一

JVM垃圾回收2(垃圾收集算法)

根据<深入理解java虚拟机>这本书总结 一.关于几个概念:(标记垃圾算法.垃圾收集算法.垃圾收集器) 前面说了如何寻找jvm垃圾,有两种方法:引用计数法/可达性算法.这篇准备讲,标记完垃圾之后,回收的算法,这里的算法只是垃圾回收的思想.后面会讲到多种垃圾收集器,这里的垃圾收集器就是运用了垃圾手机算法的思想,可以说是具体实现. 这里还是想多余的说一下这三个概念: 垃圾标记算法:标记垃圾的方法 垃圾收集算法:一种回收思想,供垃圾收集器使用.可能用在年轻代,也可能用在老年代(当然现在来说老年代和年

【从零学习经典算法系列】分治策略实例——二分查找

1.二分查找算法简介 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法.搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组 为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半.折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn). 二分查找的优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且

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

1.引用计数算法 给对象中添加一个计数器,每当一个地方引用它时,计数器值就加1:当引用失效时就减1.如果两个对象存在相互的引用,尽管这两个引用已经不再被使用,但还是不能被清除.通过一些实验可得SUN公司的JVM没有采用这种算法. 2.根搜索算法 该算法的基本思路是通过一系列的名为"GCRoots" 的对象作为起点,从这些起点开始向下搜索.搜索所通过的路径(引用链:Reference chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的.在JAVA里可用

垃圾收集算法

[根搜索算法] 这个算法的基本思路是:对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用. 可以作为根的对象 - 虚拟机栈(栈桢中的本地变量表)中的引用的对象. - 方法区中的类静态属性引用的对象. - 方法区中的常量引用的对象. - 本地方法栈中JNI的引用的对象. 方法区是jvm的一块内存区域,用来存放类相关的信息.很明显,java中单例模式创建的对象被自己类中的静态属性所引用,符合第二条,因此,单例对象不会被jvm垃圾收集. classSingleton {      

[深度学习]Wake-Sleep算法

本文翻译自2007-To recognize shapes, first learn to generate images, Geoffrey Hinton. 第五种策略的设计思想是使得高层的特征提取器能够和底层的进行通信, 同时可以很容易地使用随机二态神经元的分层网络来实现. 这些神经元的激活概率是关于总输入的一个平滑非线性方程: 其中si和sj是神经元i和j的活跃度(activity), wij是i和j的权值, bj是j的偏置. 图1 如果训练数据是使用图1中类型的多层图像模型从上到下生成的

(转)深度学习前沿算法思想

深度学习前沿算法思想 本文转自: https://mp.weixin.qq.com/s?__biz=MzA5NDExMTAzNA==&mid=2649981646&idx=2&sn=8fe05eac5a5068efb65ca1602e5fd3a0&chksm=8854b69bbf233f8db5dbaa1ea8396d181c9a35e760ab3c1c4934b504f69fe92683972d78d327&mpshare=1&scene=2&sr