Java 垃圾回收 - 收集算法

  续前节,前面列举了Java判断对象是否可回收的两种方法;可达性分析与引用权重法。多数虚拟机所采用的的是可达性分析方法。下面写一下Java中的垃圾收集算法。

  Java中垃圾收集算法主要有4中算法分别为:标记-清除法;复制算法;标记-整理法;分代收集算法。详情如下。

  1、标记-清除法

    标记清除法算法主要分两个阶段进行;①、标出所有需要回收的内存片段,②、回收所标记内存。此种方法存在两种不足。一、标记、清除两个过程对性能损耗较大,效率太低;二、标记清除后会产生大量的内存碎片。如下图:

  

  

  

  2、复制算法

  复制算法采用将Java程序申请的内存一分为二;此处用(A、B代表);首先使用A块内存;当到了GC回收时;将A内存中的所有存活对象所占用的内存片段复制并整理到B内存块中。A->B; B->A 以此方式交替进行。此方法存在弊端为;消耗大量内存空间、具体如下图:

 

  3、标记-整理法

  由于有的对象存活率较高对其它对象依赖程度也相对较高(可称为 老年代);以上两种方法都不能满足所以产生了此种算法:标记整理法。此方法与标记清理方法类似;后续清除方法不同;流程:标记->将存活对象向一端移动->清除 清除端对象。如下图:

  4、分代收集算法

  分代收集算法主要将内存分为新生代;老年代两种。在新生代中由于大批量对象处于可回收对象;所以采用复制算法。在老年代中由于大量对象并不需要清除操作;因此可以采用:标记-清除算法 或者 标记-整理算法。

原文地址:https://www.cnblogs.com/axuduo/p/11442591.html

时间: 2024-10-08 22:39:52

Java 垃圾回收 - 收集算法的相关文章

Java垃圾回收与算法详解

首先来张祖传的思维导图: 内存回收与垃圾收集器在很多时候都是影响系统性能.并发能力的主要因素,虚拟机之所以提供多种不同的收集器以及提供大量的调节参数,是因为只有根据实际应用需求.实现方式选择最优的垃圾收集方式才能获得最好的性能. GC发生在那里: JVM虚拟机运行时内存区域主要分为(如下图):虚拟机栈.本地方法栈.程序计数器.Java堆.方法区.其中虚拟机栈.本地方法栈.程序计数器为线程私有区域,在这几个区域中就不需要过多的考虑垃圾回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了.而

java垃圾回收机制的理解

Java垃圾回收机制算法 标记----清除算法 复制算法 标记----整理算法 分代收集算法 为什么要进行垃圾回收 因为当一个对象的引用不可达,或者一个对象没有任何引用指向它,那么它就没有必要在内存中继续存在,此时它就处于可以被GC(垃圾回收器)回收的对象,jvm虚拟机动态的收集不可用的对象,达到释放内存的目的. 垃圾回收区域 通常情况下的jvm虚拟机把内存都分为了如下几块 虚拟机栈(生命周期和线程相同,每一个线程执行的时候会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出入口等信息,

java 垃圾回收机制

1. java的垃圾回收机制主要工作包括:确定哪些对象属于垃圾,回收无用的对象占用的空间,使堆中的存活对象紧密排列. 2. Java垃圾回收的算法: 引用计数(基本不用): 当引用指向一个对象时,该对象的引用计数器+1: 当引用离开对象挥着被标记为null时,引用计数器-1: 当引用计数器为0时,释放对象占用的空间. 缺陷:如果对象间存在循环引用,可能会发生对象无法被回收的情况. 停止-复制: 对象发现: 从堆栈和静态存储区出发遍历所有引用,找到引用的对象以及该对象包含的所有引用,从而找到所有活

Java的垃圾回收之算法

引言 Java的堆是一个运行时数据区,类的实例(对象)从中分配空间.Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象, 这些对象通过new.newarray.anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放.一般来说,堆的是由 垃圾回收来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时 候都有一个由垃圾回收所管理的堆.垃圾回收是一种动态存储管理技术,它自动地释放不

java垃圾回收算法

(1)引用计数法 这是最经典和最古老的一种,它的工作原理是为每个对象配备一个计数器,只有这个对象被引用了,引用计数器就加1,当引用失效时,计数器减一,只要计数器为0,意味着不再被使用,于是该对象就可以被回收了. 优点:实现简单: 缺点:无法处理循环引用情况.即有应该被回收的垃圾对象A.B,他们互相引用,除此之外无其他引用,然而他们计数器值不是0,因此无法回收,从而造成内存泄漏. (2)标记-清除算法 这个算法将垃圾回收分为两个阶段,标记阶段和清除阶段,在标记阶段,首先通过根结点,标记所有从根结点

Java GC专家系列2:Java 垃圾回收的监控

这是”成为GC专家系列”文章的第二篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.到目前为止,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在本篇中,我将介绍JVM在真实环境中如何运行GC的. 什么是GC监控 GC监控 指的是在运行时跟踪JVM运行GC的过程.例如,通过GC监控,我们能找出: 何时新生代的对象会被移动到老年代,有多少对象被移到了老年代. 何时stop-the-world发生以及持续时间. 通

成为Java GC专家(3)—如何优化Java垃圾回收机制

本文作者: ImportNew - 王晓杰 未经许可,禁止转载! 本文是成为Java GC专家系列文章的第三篇.在第一篇<成为JavaGC专家Part I — 深入浅出Java垃圾回收机制>中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响. 在第二篇<成为JavaGC专家Part II — 如何监控Java垃圾回收机制>,我解释了JVM实际上是如何执行垃圾回收的,我们如何监控GC,以及

[译]GC专家系列2:Java 垃圾回收的监控

原文链接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 这是"成为GC专家系列"文章的第二篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.到目前为止,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在本篇中,我将介绍JVM在真实环境中如何运行GC的. 什么是GC监控 GC监控 指的是在运

【Java】Java垃圾回收机制

Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 一.如何确定某个对象