JVM学习总结二——垃圾回收算法
昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法。这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原理上是一样的,而且JVM的相对更为简单点。
在初学JVM的时候,我们往往会对这部分感到迷惑:网上不少博客介绍的五花八门,像引用计数算法、串行、并行、并发算法等,他们到底算不算垃圾回收算法,算的话又和基本的那几个算法有什么关系呢?(PS:其实如果认真看过书的话,就不会疑惑了,因为书里边介绍的很清晰),下边我们来理一下这些算法的关系:
- 对象存活判断算法:引用计数、可达性分析
- 基本的垃圾回收算法:标记-清除、复制、标记-整理
- 依赖线程实现的回收算法:串行、并行、并发
其中对象存活判定算法是其他算法的基石,用来判断对象是否存活,能否回收;基本的垃圾回收算法是垃圾垃圾收集器实现的基础算法;而依赖线程实现的算法,则是基本算法在考虑线程环境下的运用,这个有多线程基础的看名字就明白了。此外,还有综合以上算法并从特定角度实现的算法,如分代回收(针对分区)、增量回收(针对实时性)等,在此不再介绍 。
一、对象存活判断算法
在我们回收一个对象之前,我们首先要搞明白的一点是这个对象是不是已经死了(没有用了),而对于java程序而言,当一个对象不再被引用,那么他就死了(没被引用就无法被正常访问了)。为实现这个判断,可以使用两种算法实现:引用计数和可达性分析。
引用计数实现计较简单,每个对象对应一个引用计数器,当有被引用的时候就+1,引用被释放的时候-1,这样当该值为0时,则对象已死。这一算法有个问题就是:当出现相互引用(类似于多线程死锁的情况)的时候,对象虽死,但是计数器却不为0。
可达性分析也叫做根节点搜索算法,其实现是根据图的搜索(当然,图的搜索其实就是树遍历),JVM首先创建一个GC Root的根节点,所有创建的对象在存活的时候都能根据引用关系找到到达该根节点的路径,如果找不到路径,则说明该对象已死。这一算法不仅解决了引用计数的缺陷,而且不用每一对象都维护一个计数器,目前最常用的HotSpot虚拟机就采用该算法。
二、基本垃圾回收算法
所谓算法,就是在时间、空间、实现复杂度这三者的互博中寻求一个最优的实现。而几种垃圾回收算法也是在这几个方面各有侧重。
标记-清除算法分为两个阶段:先对回收对象进行标记,然后统一回收。这种思路很简单,实现也很容易,但是却头两个缺点:一是标记、清除效率都很低,二是会产生碎片化,清除后空出来的空间是零散的。
复制算法是将内存空间分为两个部分,对象同时只存在其中一个里边,当回收时将存活对象复制到另一区即可,这样就不用再进行清除了(直接覆盖即可),还不会产生生碎片。之前提到分代回收中Eden去的survivor便使用该算法。但是该算法缺点也很明显,有一半空间浪费了,典型的空间换时间。
标记-整理算法是标记-清除的升级版,上边说到,清理过程也是效率很低的,那么该算法第二步就不进行清理,而是将对象向前移动,覆盖该回收的区域,这样整理后就不会产生碎片了。年老代一般采用该算法。
该部分可参考。
三、串行、并行、并发垃圾回收器
首先我们要提到一点是,垃圾回收由于涉及对内存的整理,要求整理时内存状态是不能被程序改变的,也就是Stop-The-World模式下进行。当gc时间过长时,程序会出现长时间停顿,这对于响应较高的应用是不可接受的。因此,在结合线程后实现了不同方式的收集器,以满足不同需求。
- 串行收集:串行收集使用单线程处理所有垃圾回收工作,因为无需多线程交互,实现容易,而且效率比较高。但是,其局限性也比较明显,即无法使用多处理器的优势,所以此收集适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。一般只能用于小型应用。
- 并行收集:并行收集使用多线程处理垃圾回收工作,因而速度快,效率高。而且理论上CPU数目越多,越能体现出并行收集器的优势。 适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。
- 并发收集:相对于串行收集和并行收集而言,前面两个在进行垃圾回收工作时,需要暂停整个运行环境,而只有垃圾回收程序在运行,因此,系统在垃圾回收时会有明显的暂停,而且暂停时间会因为堆越大而越长。适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。
此外还要提到的一点是,因为不同系统、不同JVM对于线程的处理不同,所以这几个算法的的实现都是依赖于垃圾收集器的实现的,我们可以通过JVM参数来指定不同收集器进行处理。
本次JVM相关算法介绍完毕,下次将重点放在JVM监控、调优等方面,由于个人没有太多实践经验,这部分主要会整理相关资料。
JVM学习总结二——垃圾回收算法的更多相关文章
- JVM学习(三):垃圾回收算法
局部性原理和分代回收思想 大学学习操作系统或者计算机组成原理的时候都提到一个重要概念,叫局部性原理. 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小 ...
- JVM虚拟机学习一:垃圾回收算法总结
1.java虚拟机中涉及到的数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某 ...
- JVM内存模型,垃圾回收算法
JVM内存模型总体架构图 程序计数器多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源.因此每个线程有要有一个独立的程序计数器,记录下一条要运行的指令.线程 ...
- Jvm垃圾收集器和垃圾回收算法
概述: 目前内存的动态分配和内存的回收技术已经相当成熟,一切看起来都已经进入了“自动化”时代,为什么还要去了解GC和内存分配呢?原因很简单:当需要排查各种内存泄漏.内存溢出问题时,当垃圾收集器成为系统 ...
- JVM学习笔记二:垃圾收集算法
垃圾回收要解决的问题: 哪些内存需要回收? 线程私有区域不需要回收,如PC.Stack.Native Stack:Java 堆和方法区需要 什么时候回收? 以后的文章解答 如何回收? 首先进行对象存活 ...
- 轻松学JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- 深入理解JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- JVM内存模型及垃圾回收算法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- JVM学习记录2--垃圾回收算法
首先要明确,垃圾回收管理jvm的堆内存,方法区是堆内存的一部分,所以也是. 而本地方法栈,虚拟机栈,程序计数器随着线程开始而产生,线程的结束而消亡,是不需要垃圾回收的. 1. 判断对象是否可以被回收 ...
随机推荐
- 为知笔记 Markdown 新手指南
为知笔记 Markdown 新手指南 http://www.wiz.cn/feature-markdown.html 时序图,流程图详细流程图语法 http://adrai.github.io/flo ...
- centos 7 安装音乐播放器(亲测可用)
方法来源网上,非原创. 1. Install the nux repo $> su - $> yum update # optional but recommanded $> rp ...
- 学习练习 java产生6个不同的数字
public static void main(String[] args) { Random r=new Random(); int arr[]=new int[6]; for(int i=0;i& ...
- C语言中的fread和fwrite
C语言中的fread和fwrite是专门用来操作文件的方法. 1. fread负责从打开的文件指针中读取文件内容. 函数原型:size_t fread(void *p, size_t size, si ...
- 【MVC】自定义ASP.NET MVC Html辅助方法
在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么 ...
- fluentd正则表达式
一: 匹配上则取否则不取 匹配规则为 \[sv=(?<sv>[^\]]*?)\].*?\[os=(?<os>[^\]]*?)\].*?\[net=(?<net>[^ ...
- CSS3 background-size图片自适应
转自:http://www.html5cn.com.cn/css3/2013-04-21/267.html: background-size属性和background-origin属性.backgro ...
- 设计模式-代理模式(Proxy)
应用场景: 领导都有秘书,一般会代理领导的部分职能角色,处理签字.报销.开会等任务.很多新人可能都只知道秘书的存在,毕竟每天与其打交道,不知道领导的存在.但是领导的的确确是真实存在的. 场景说明: 代 ...
- sublime搭建Java编译平台及编码问题
Sublime自带Java编译功能,当时只能编译不能运行,我们做一下小小的修改就可以让sublime一步完成编译运行的功能,实现sublime搭建Java编译平台. 使用Ctrl + B 编译时,所编 ...
- linux下多ISP的策略路由
http://kerry.blog.51cto.com/172631/385578/ 修改/etc/iproute2/rt_tables 先在 /etc/iproute2/rt_tables 下建兩個 ...