GC原理---垃圾收集算法

垃圾收集算法

Mark-Sweep(标记-清除算法)
  • 标记清除算法分为两个阶段,标记阶段和清除阶段。标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标记对象的空间。
  • 优缺点:实现简单,容易产生内存碎片。因为会存在大量的空间碎片,因为回收后的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc。
标记-压缩算法
  • 首先也需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。这种方法既避免了碎片的产生,又不需要两块相同的内存空间,因此,其性价比比较高。
  • 标记-压缩算法是一种老年代的回收算法,它在标记-清除算法的基础上做了一些优化。
  • 优缺点:不容易产生内存碎片;内存利用率高;存活对象多并且分散的时候,移动次数多,效率低下
复制算法
  • 将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。
  • 优缺点:不容易产生内存碎片;可用内存空间少;存活对象多的话,效率低下。
分代收集算法
  • 当前商业虚拟机的垃圾收集都采用“分代收集”算法,该算法根据对象存活周期的不同,将内存划分为几块。一般把java堆划分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的算法。
  • 在新生代中,每次垃圾收集都发现有大批对象死去,只有少量存活,那就采用复制法,只需要付出少量存活对象的复制成本就可以完成收集
  • 而老年代中对象存活率高,没有额外空间对它进行分配担保,就必须采用“标记-清除”算法或“标记-整理”算法来进行回收。

原文地址:https://www.cnblogs.com/frankltf/p/10358755.html

时间: 2024-10-09 10:43:50

GC原理---垃圾收集算法的相关文章

GC原理---垃圾收集器

垃圾收集器 如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现 Serial收集器 串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收.新生代.老年代使用串行回收:新生代复制算法.老年代标记-压缩:垃圾收集的过程中会Stop The World(服务暂停) 参数控制:-XX:+UseSerialGC 串行收集器 ParNew收集器 ParNew收集器其实就是Serial收集器的多线程版本.新生代并行,老年代串行:新生代复制算法.老年代标记-压

JVM初探- 内存分配、GC原理与垃圾收集器

JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念上可简单认为new时分配外, 我们着重介绍后面的3个步骤: I. 怎样分配- JVM内存分配策略 对象内存主要分配在新生代Eden区, 如果启用了本地线程分配缓冲, 则优先在TLAB上分配, 少数情况能会直接分配在老年代, 或被拆分成标量类型在栈上分配(JIT优化). 分配的规则并不是百分百固定, 细节主要取

GC垃圾收集算法

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

垃圾收集算法

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

java虚拟机(jvm)垃圾收集算法剖析

目前商业虚拟机的垃圾收集都采用"分代收集"算法,这种算法根据对象的存活周期把内存划分为"新生代"和"老年代".然后根据不同的年 代的特点采取不同的收集算法.在新生代中,由于每次minor GC都发现有很多对象死去,存活的非常少,因此采用复制算法.而老年代中对 象存活率非常的高,而起没有额外的内存空间进行分配担保就采用"标记-清理"或"标记-整理"算法来进行回收.但是基本上使用的"标记-整理&quo

Java 内存模型及GC原理 (转载)

一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两种类型内存:堆和非堆,堆内存

深入理解_JVM内存管理垃圾收集算法04

1.垃圾收集算法(方法论): 定义:JVM通过GC来回收堆和方法区中的内存. GC的基本原理:首先会找程序中不再被使用的对象:然后回收这些对象所占用的内存. 算法分类: (1) 按照基本回收策略分: <1>引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象.此算法最致命的是无法处理循环引用的问题. <2> 标记-清除(Mark-Sweep): Before G

【转】Java 内存模型及GC原理

一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两种类型内存:堆和非堆,堆内存

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

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