JVM-GC算法

本篇主要阐述一下java垃圾收集的几种算法(垃圾收集主要发生在Java堆和方法区)。其中主要包括:引用计数法(JVM未使用)、标记-清除算法标记-压缩(清理)算法复制算法分代收集算法。下面简单介绍一下其实现的原理。

1、引用计数法

引用计数法的实现相对简单,每个对象的实例都保存着被引用的个数,如下图所示。该数值随着被引用的个数的增减而增减。

引用计数法示例图

但是由于引用计数法在引用成环的时候无法进行计数,故JVM并未采用该方法。如下图所示:

引用计数法成环示意图

2、标记-清除算法

标记清除算法可以分为两个阶段:标记阶段和清除阶段。其中标记阶段标识出了所有需要回收的对象。其次在标记完成之后,对已经标记的对象实施清理工作。一个方面,原先已经被占用的内存空间的位置没有改变,这样以来就会产生大量的内存碎片;另外,标记清除的效率不高(当无效内存较多时,标记和清除都比较耗时)。如下图所示:

标记-清除算法示意图

3、标记-压缩(清理)算法

标记-压缩算法相对于标记-清除算法而言,前半部分的过程相同,也就是标记阶段。但对于压缩阶段,它将有效的空间依次整理成连续的内存空间。完成之后,以最后的有效空间为边界,释放后面的所有内存空间。如下图所示:

标记-压缩(清理)算法示意图

4、复制算法

复制算法概括为,内存中同时有两片相同大小的空间。同一时间只有一片空间可以被利用,另外一片空间则作为GC时,有效内存要拷贝到的空间。当数据从前一片空间中全部拷贝到后一片空间时,前一片的内存空间会被全部释放。如下图所示:

复制算法示意图

复制算法相对于其他几种算法而言,会浪费一半的内存空间。因此在实际的应用当中(以Hotspot为例),会使用复制算法结合标记-压缩(清理)的思想。其效果图如下所示:

复制算法的整合示意图

5、分代收集算法

当前商用的JVM大都使用了分代收集的思想,(以Hotspot为例)通常可以将堆内存分为新生代和老年代。新生代又可以分为,一块较大空间的Eden区和两块较小且相等的Survivor1和Survivor2区。每次新产生的对象优先放在Eden区,S1和S2区则存放年龄更大的对象,并且两者的GC算法为复制算法。年龄更大的对象则会进入老年代。其示意图可参考上面的“复制算法的整合示意图”。

时间: 2024-08-01 10:46:08

JVM-GC算法的相关文章

JVM GC算法 CMS 详解(转)

前言 CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用.CMS是用于对tenured generation的回收,也就是年老代的回收,目标是尽量减少应用的暂停时间,减少full gc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清

JVM GC算法 垃圾回收器

JVM的垃圾回收算法有三种: 1.标记-清除(mark-sweep):啥都不说,直接上图 2.标记-整理(mark-compact) 3.复制(copy) 分代收集算法                                                    目前的垃圾回收都采用分代收集算法.也就衍生了很多垃圾收集器 "分代收集"(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法. 在新生

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

【转载】Java性能优化之JVM GC(垃圾回收机制)

章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-

JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的性能尽可能的好呢?是不是虚拟机内存越大越好? Java 7之前和Java 8的堆内存结构 Java栈的分配参数 GC算法思想介绍 –GC ROOT可达性算法 –标记清除 –标记压缩 –复制算法 可触及性含义和在Java中的体现 finalize方法理解 Java的强引用,软引用,弱引用,虚引用 GC

46张PPT讲述JVM体系结构、GC算法和调优

本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传至Github(点此下载),另外良心推荐阅读<深入理解Java虚拟机JVM高级特性与最佳实践.pdf>(点此下载).

关于JVM常用的GC算法

[Author]: kwu 关于GC(Garbage Collection)的算法,常用的有以下几种: 1.引用计数法 1) 老牌垃圾回收算法,通过引用计算来回收垃圾.引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1.只要对象A的应用计数器的值为0,则对象A就不可能再被使用. 使用引用计数法的语言: Micsoft COM ActionScript3 Python 2) 引用计数法的问题: 引用和去引用伴随加法和减法,影响

深入JVM《四》 GC算法与种类

一.GC的概念 Garbage Collection 垃圾收集. 1960年 List 使用了GC. Java中,GC的对象是堆空间和永久区. 二. GC算法 1. 引用计数法(没有被java采用,在python中有) 老牌垃圾回收算法. 通过引用计算来回收垃圾. 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1.只要对象A的引用计数器的值为0,则对象A就不可能再被使用. 问题: 1.引用和去引用伴随加法和减法,影响性能

JVM垃圾回收(四)- GC算法:实现(1)

GC算法:实现 上面我们介绍了GC算法中的核心概念,接下来我们看一下JVM里的具体实现.首先必须了解的一个重要的事实是:对于大部分的JVM来说,两种不同的GC算法是必须的,一个是清理Young Generation的算法,另一种是清理Old Generation的算法. 在JVM里有各种各样的这种内置算法,如果你没有特别指定GC算法,则会使用一个默认的.适应当前平台(platform-specific)的算法.接下来我们会解释每种算法的工作原理. 下面的列表提供了一个快速的预览,关于哪些算法可能

JVM内存模型与GC算法(简介)

JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明. 1.1程序计数器 程序计数器是众多编程语言都共有的一部分,作用是标示下一条需要执行的指令的位置,分支.循环.跳转.异常处理.线程恢复等基础功能都是依赖程序计数器完成的. 对于Java的多线程程序而言,不同的线程都是通过轮流获得cpu的时间片运行的,这符合计算机组成原理的基本概念,因此不同的线程之间需要不停的获得运行,挂起等待