JVM常见的垃圾回收算法

          JVM常见的垃圾回收算法

  1、标记-清除算法

    标记清除算法也是最基础的算法,就如同他的名字一样,标记清除算法的步骤分为两个步骤,首先标记出需要回收的所有对象,然后在完成标记之后统一清除掉所有被标记的对象,之所以说它是最基础的算法,是因为后续算法都是基于此算法,改进其缺点衍生出来的,标记清除算法有两个缺点,标记和清除这两个步骤都会有性能损耗,且效率低,其次是在完成对象的清除后会留下不连续的内存碎片,算法如下图:

2、复制算法

为了提高效率,我们又引入了复制算法,将现有可用的内存大小均分为二,每次只使用其中一半,当这半内存已满,就将未消亡的对象copy到另一半去,然后再把使用过的内存清除掉,往复如此,每次分配内存我们只需要按照顺分配,就不需要考虑产生内存碎片,高效运行,但也有一个缺点,就是每次可以使用的内存减半,算法如下图:

3、标记-整理算法

我们发现,在对象存活率较高的时候(老年代的特点),每次复制都包含了对大量存活对象的copy,这个时候就会大大降低复制算法的效率,除此之外,我们也不想可用内存减半,这时候我们就需要引入标记整理算法,标记整理算法也分为两个步骤,第一步标记和标记清理算法一致,标记需要回收的对象,不过第二步不是直接回收,而是将村会的对象向可用内存空间某一端移动,而清除掉端边界以外的内存。算法如图:

4、分代收集算法

    目前商用虚拟机所使用的收集算法,将内存分为多个模块,把新生的对象存储在新生代(也叫年轻代),将新生代多次gc依旧存活的对象移动到老年代中。

    新生代:存储新创建的对象,gc时往往伴随着大量的需要回收的对象,所以新生代采用复制算法,只需将少量存活对象copy,就可以完成对象回收。

    老年代:当新生代创建的对象经历多次gc依旧存活之后,就会将他移动到老年代,所以在对老年代的对象进行回收时,往往伴随着大量存活的对象,这时候就可以选择 标记清除算法标记整理算法。

       持久代:存放静态文件,java类、方法等,对垃圾回收并无太大影响

原文地址:https://www.cnblogs.com/msqz/p/8366571.html

时间: 2024-10-12 16:04:53

JVM常见的垃圾回收算法的相关文章

JVM学习记录-垃圾回收算法

简述 因为各个平台的虚拟机的垃圾收集器的实现各有不同,所以只介绍几个常见的垃圾收集算法. JVM中常见的垃圾收集算法有以下四种: 标记-清除算法(Mark-Sweep). 复制算法(Copying). 标记整理算法(Mark-Compact). 分代收集算法(Generational Collecting). 标记-清除算法 标记-清除算法是现代垃圾回收算法的思想基础,主要分为两个阶段:标记阶段和清除阶段.首先根据可达分析算法,标记处可以回收的对象,标记完成后,进行清除阶段,将标记为可回收的对象

JVM优化 垃圾回收 算法 垃圾收集器 GC日志可视化查看

今日内容了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行.并行.并发.G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收?程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存 资源,最终将导致内存溢出,所以对内存资源的管理是非常重要了. 1.1.C/C++语言的垃圾回收在C/C++语言中,没有自动垃圾回收机制,是通过new关键字申请内存资源,通过delete 关键字释放内存资源.如果,程序员在某些位置没有写delete进行释放,那么申请的对象将一直占用内存资源,

谈谈JVM垃圾回收机制及垃圾回收算法

一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”.垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存. ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其

常用垃圾回收算法

今天我关于常见的垃圾回收算法来做个总结,我们最常听到的是Java虚拟机里的垃圾回收机制,其实垃圾回收的概念最先并不是Java里首先提出来的, 垃圾回收这个概念很早就已经被提出来了,并且已经在其他语言中得到了应用. 关于垃圾回收的机制,这里不再解释,这篇文章我主要介绍常见的垃圾回收算法,当然还有其他的. 算法一:引用计数法. 这个方法是最经典点的一种方法.具体是对于对象设置一个引用计数器,每增加一个变量对它的引用,引用计数器就会加1,没减少一个变量的引用, 引用计数器就会减1,只有当对象的引用计数

JVM常见垃圾回收算法

jdk1.7.0_79 众所周知,Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收算法.本文将介绍几种常见的垃圾回收(下文简称GC)算法. 在Java堆上分配一个内存给实例对象时,此时在虚拟机栈上引用型变量就会存放这个实例对象的起始地址. Object obj = new Object();  现在如果我们将变量赋值为null. obj = null; 此时可以看到Java堆上的实例对象无法再次引用它,那么它就是被GC的对

直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结

垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象.然后,在清除阶段,清除所有未被标记的对象. 适用场合: 存活对象较多的情况下比较高效 适用于年老代(即旧生代) 缺点: 容易产生内存碎片,再来一个比较大的对象时(典型情况:该对象的大小大于空闲表中的每一块儿大小但是小于其中两块儿的和),会提前触发垃圾回收 扫描了整个空间两次(第一次:标记存活对象:第

JVM虚拟机-03、JVM内存分配机制与垃圾回收算法

JVM虚拟机-03.JVM内存分配机制与垃圾回收算法 1 JVM内存分配与回收 1.1 对象优先在Eden区分配 大多数情况下,对象在新生代中?Eden?区分配.当?Eden?区没有足够空间进行分配时,虚拟机将发起一次Minor?GC.我们来进行实际测试一下.在测试之前我们先来看看?Minor?GC和Full?GC?有什么不同呢? Minor?GC/Young?GC:指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快. Major?GC/Full?GC:一般会回收老年代,

JVM垃圾回收算法 总结及汇总

先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,

JVM垃圾回收算法(最全)

JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前两种标识算法.三种回收算法.两种清除算法.三种收集器 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示,对象A-对象B-对象C