JVM内存管理:垃圾搜集器简介

引言

上一章我们已经探讨过GC的各个算法,那么垃圾搜集器是什么呢?

通俗的讲,使用编程语言将算法实现出来,产生的程序就是垃圾搜集器了。既然谈到了编程语言的实现,那么在讨论垃圾搜集器的时候,就已经涉及到具体的虚拟机实现了。

或许有不少做JAVA开发的猿友还不知道,我们平时使用的JDK中,默认的JVM是hotspot,换句话说,我们大部分时候使用的JVM都是hotspot的实现版本,因此,本次LZ讨论垃圾搜集器都是基于hotspot版JVM来进行的,请各位猿友要知晓这一点。

更直观的,我们可以在我们平时开发的机子上,输入java -version来查看JVM的版本,相信大部分猿友对这个命令都不陌生吧,LZ的机子截图如下。

垃圾搜集器的分类

上面我们已经提到,垃圾搜集器实际就是算法的编程语言实现。既然牵扯到编程语言,那么必然离不开线程,而且我们在前面讲解算法的时候也一直假设是一条GC线程在做着GC的事情。

因此,垃圾搜集器大致分为以下三类。

串行搜集器(serial collector):它只有一条GC线程,且就像前面说的,它在运行的时候需要暂停用户程序(stop the world)。

并行搜集器(parallel collector):它有多条GC线程,且它也需要暂停用户程序(stop the world)。

并发搜集器(concurrent collector):它有一条或多条GC线程,且它需要在部分阶段暂停用户程序(stop the world),部分阶段与用户程序并发执行。

并发(concurrent)与并行(parallel)

看完上面的定义,相信有一部分猿友已经蒙了,一会单线程,一会多线程,一会串行,一会并行,一会并发,这都神马玩意?

单线程和多线程就不必多说了,这个很好理解,串行与并行也比较好理解,难于分辨的就是并行(parallel)与并发(concurrent)。

对于很多有关并发的解释,LZ觉得有一个最贴切。它是这么解释的,并发就是两个任务A和B需要相互独立的运行,并且A任务先开始后,B任务在A任务结束之前开始了。

并发本身是比较好理解的,那么它与并行的关系与区别是什么呢?

事实上,并行是并发的一种实现方式。LZ觉得这么说各位可能会更好理解,当然,并行并不是并发的唯一实现方式,还有一种就是我们所熟悉的时间片切换。也就是A任务执行一会,B任务执行一会,交替执行。

并行必须在多核多处理器或者分布式系统(本质还是多核多处理器)的前提下才能发生,而交替执行或者说时间片切换是在单核的处理器上发生的。

hotspot中的垃圾搜集器

我们上面已经简单探讨了垃圾搜集器的分类,在hotspotJVM中,每一个种类的垃圾搜集器都有对应的实现,如下。

串行搜集器的实现:serial(用于新生代,采用复制算法)、serial old(用于年老代,采用标记/整理算法)

并行搜集器的实现:ParNew(用于新生代,采用复制算法)、Parallel Scavenge(用于新生代,采用复制算法)、Parallel old(用于年老代,采用标记/整理算法)

并发搜集器的实现:concurrent mark sweep[CMS](用于年老代,采用标记/清除算法)

可以看到,上面每一种垃圾搜集器都是针对不同内存区域所设计的,因为它们采用的算法不同,凡是用于新生代的都是使用的复制算法,而用于年老代的都是使用的标记/清除或者标记/整理算法。

在实际应用中,我们需要给JVM的新生代和年老代分别选择垃圾搜集器,可以看到无论是新生代还是年老代都分别有三种实现,换句话说,我们应该有3*3=9种选择。但是,事实并非如此。

事实上,这六种垃圾搜集器只有六种选择,因为有的垃圾搜集器由于具体实现的方式等一系列原因无法在一起工作,如下图。

针对上图,红的就是串行搜集器,绿的是并行搜集器,唯一一个黄的是并发搜集器。上面三个是新生代的搜集器,下面三个是年老代的搜集器。两者之间有连线,则表示两者可以配合工作。

这六种组合并没有说哪个组合最强,哪个组合最弱,还是那句话,只有最合适的,没有最好的。因此这就需要我们对每一种组合有一定的认识,才能在使用的时候选择更适合的垃圾搜集器。

结束语

本次大致介绍了一下六种垃圾搜集器,以及它们的关系。每一种垃圾搜集器的特点与执行方式,我们在下一章再一起探讨。

作者:zuoxiaolong(左潇龙)

出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong

时间: 2024-10-02 07:28:26

JVM内存管理:垃圾搜集器简介的相关文章

JVM内存管理:垃圾搜集器参数精解

本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器选择参数 UseSerialGC:开启此参数使用serial & serial old搜集器(client模式默认值). UseParNewGC:开启此参数使用ParNew & serial old搜集器(不推荐). UseConcMarkSweepGC:开启此参数使用ParNew & CMS(serial old为替补)搜集器. U

JVM内存管理:垃圾搜集器详解

引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设计模式时使用的方式,针对某些搜集器,分几个维度去解释这些搜集器. client模式与server模式 在介绍本章内容之前,要说一下JVM的两种模式,一种是client模式,一种是server模式.我们平时开发使用的模式默认是client模式,也可以使用命令行参数-server强制开启server模式

JVM内存管理及GC机制

一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.经过这么长时间的发展,Java GC机制已经日臻完善,几乎可以自动的为我们做绝大多数的事情. 虽然java不需要开发人员显示的分配和回收内存,这对开发人员确实降低了不少编程难度,但也可能带来一些副作用: 1. 有可能不知不觉浪费了很多内存 2. JVM花

现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)

JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分:Code Cache(代码缓存区).Perm Gen(永久代).Jvm Stack(java虚拟机栈).Local Method Statck(本地方法栈). HotSpot虚拟机GC算法采用分代收集算法: 1.一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直

[CLR via C#]21. 自动内存管理(垃圾回收机制)

原文:[CLR via C#]21. 自动内存管理(垃圾回收机制) 目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象清理资源 使用实现了Dispose模式的类型 C#的using语句 手动监视和控制对象的生存期 对象复活 代 线程劫持 大对象 一.理解垃圾回收平台的基本工作原理 值类型(含所有枚举类型).集合类型.String.Attribute

JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代

如果大家想深入的了解JVM,可以读读周志明<深入理解Java虚拟机:JVM高级特性与最佳实践>      需要掌握的东西,包括以下内容.判断对象存活还是死亡的算法(引用计数算法.可达性分析算法).常见的垃圾收集算法(复制算法.分代收集算法等以及这些算法适用于什么代)以及常见的垃圾收集器的特点(这些收集器适用于什么年代的内存收集).            JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示.      JVM内存结构由程序计数器.堆.栈.本地

JVM内存管理:GC算法精解---分代搜集算法

引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分类 上一章已经说过,分代搜集算法是针对对象的不同特性,而使用适合的算法,这里面并没有实际上的新算法产生.与其说分代搜集算法是第四个算法,不如说它是对前三个算法的实际应用. 首先我们来探讨一下对象的不同特性,接下来LZ和各位来一起给这些对象选择GC算法. 内存中的对象按照生命周期的长短大致可以分为三种

JVM内存管理:GC简介

为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题,很多时候会让人不知所措. 当我们了解了相关知识以后,虽然有时候依然不能很快的解决问题,但可以肯定的是,至少不会出现无计可施的情况. GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪些问题呢,粗略的来说,主要有以下几点. 1.哪些对象可以被回收. 2.何时回收这些对象. 3

JVM内存管理 (转)

一.物理内存与虚拟内存1.物理内存                (1)RAM        所谓物理内存就是我们通常所说的RAM(随机存储器).        (2)寄存器        在计算机中,还有一个存储单元叫寄存器,它用于存储计算单元执行指令(如浮点.整数等运算时)的中间结果.寄存器的大小决定了一次计算可使用的最大数值.        (3)地址总线        连接处理器和RAM或者处理器和寄存器的是地址总线,这个地址总线的宽度影响了物理地址的索引范围,因为总线的宽度决定了处理器