JVM垃圾算法及回收器

说到JVM垃圾回收,我们通常会问三个问题,回收对象是什么?什么时候回收?怎么回收?JVM垃圾回收主要回收的区域是Java堆,通过了解JVM内存结构,我们知道堆主要负责对象和数组的存储。堆还可以进行细分。

一、堆内存分类

1. 新生代 - 新对象进入新生代,新生代可以分为三个区域

eden -新对象首先进入的区域

from survior -新生代另外一个区域

to survior -同上

2. 老年代old generation -- 在新生代中经历了N次垃圾回收后仍然存活的对象就会被放到老年代中。而且大对象直接进入老年代。

new出来的对象进入eden区。因为大部分对象都是朝生夕死,根据经验分析,一般eden和survior的大小比为8:1。当eden满了则进行一次minor GC,如果对象大小大于survior区大小则对象进入老年区。为什么需要分代,因为如果不分的话对所有对象进行标记-清理的话,则效率较低,而且清理会使虚拟机暂停,影响性能。为什么要有2个survior区,这是为了减少碎片的产生。当进行一次minorGC时,如果只有一个survior区,那么会导致碎片产生。如果有2个survior的话,eden和一个survior的存活的对象一起复制到另外一个survior区,则没有碎片

二、什么时候回收

当堆内存不足时进行回收,这里回收方式有2种

1. minor gc --新生代GC回收,速度快,频率高

2. full gc触发 --老年代GC回收,速度慢比minorGC慢10倍左右,频率低

三、回收对象

1. 引用计数算法

基本原理:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1。任何时刻计数器为0的对象就是不可能再被使用的

优点:简单,高效

缺点: 很难处理循环引用

2. 可达性分析算法

基本原理:从GC Roots(每种具体实现对GC Roots有不同的定义)作为起点,向下搜索它们引用的对象,可以生成一棵引用树,树的节点视为可达对象,反之视为不可达

如何判断对象已死

四、如何回收

1. 回收算法

1. 标记清除算法 (Mark-Sweep)

基本原理:从根节点开始,标记出所有可达的对象;然后清除所有未标记的对象

缺点:效率低,需要从头到尾遍历;产生较多不连续的碎片

2. 复制算法 (Copying)

基本原理:从根节点开始,标记出所有可达的对象;然后清除所有未标记的对象

优点:效率高,不用考虑碎片等复杂情况

缺点:只能用一半内存

3. 标记整理算法 (Mark-Compact)

基本原理:从根节点开始,标记出所有可达的对象;然后让所有对象向一端移动,然后清理掉边界以外的内存

优点:不会产生内存碎片

缺点:在标记的基础之上还需要进行对象的移动,成本相对较高,效率也不高

4. 分代回收算法

2. 回收器

新生代回收器

Serial 单线程:简单高效

ParNew Serial的多线程版本,能与CMS配合,不能与PS配合

Parallel Scavenge 复制算法,多线程并行,适合对响应时间要求较高的场景

老年代回收器

Serial Old 单线程,搭配PS

Parallel Old PS的老年版

CMS 获取最短时间为目标的收集器

G1 基于标记整理,能非常精确的控制java堆

《Java Garbage Collection Basics》

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

《Java虚拟机详解----JVM常见问题总结》

http://www.cnblogs.com/smyhvae/p/4810168.html

时间: 2024-10-11 16:52:19

JVM垃圾算法及回收器的相关文章

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

JVM 垃圾回收器工作原理及使用实例介绍(转载自IBM),直接复制粘贴,需要原文戳链接

原文 https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/ 再插一个关于线程和进程上下文,待判断 http://blog.sina.com.cn/s/blog_75e9551f01016cm3.html 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥有垃圾收集

JVM垃圾回收器工作原理及使用实例介绍

垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥有垃圾收集器可以说是 Java 语言与 C++语言的一项显著区别.在 C++语言中,程序员必须小心谨慎地处理每一项内存分配,且内存使用完后必须手工释放曾经占用的内存空间.当内存释放不够完全时,即存在分配但永不释放的内存块,就会引起内存泄漏,严重时甚至导致程序瘫痪. 以下列举了垃圾回收器常用的算法及实

JVM 垃圾回收器工作原理及使用实例介绍

垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥有垃圾收集器可以说是 Java 语言与 C++语言的一项显著区别.在 C++语言中,程序员必须小心谨慎地处理每一项内存分配,且内存使用完后必须手工释放曾经占用的内存空间.当内存释放不够完全时,即存在分配但永不释放的内存块,就会引起内存泄漏,严重时甚至导致程序瘫痪. 以下列举了垃圾回收器常用的算法及实

JVM垃圾回收机制与算法

JVM内存由几个部分组成:堆.方法区.栈.程序计数器.本地方法栈 JVM垃圾回收仅针对公共内存区域,即:堆和方法区进行,因为只有这两个区域在运行时才能知道需要创建些对象,其内存分配和回收都是动态的. 一.垃圾回收策略 1.1分代管理 将堆和方法区按照对象不同年龄进行分代: (Young Generation and Old Generation)堆中会频繁创建对象,基于一种分代的思想,按照对象存活时间将堆划分为新生代和旧生代两部分,并不是一次垃圾回收新生代存活的对象就放入旧生代, 而是要经过几次

JVM 垃圾回收器工作原理及使用实例介绍(原文已发表于IBM开发者论坛)

打个广告,本人的<大话Java性能优化>一书已经在亚马逊.当当.京东.天猫出售,感谢大家对致力于技术推广梦想者的支持. 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥有垃圾收集器可以说是 Java 语言与 C++语言的一项显著区别.在 C++语言中,程序员必须小心谨慎地处理每一项内存分配,且内存使用完后必须手工释放曾经占用的内存空间.当内存释

JVM系列(六) - JVM垃圾回收器

前言 在之前的几篇博客中,我们大致介绍了,常见的 垃圾回收算法 及 JVM 中常见的分类回收算法.这些都是从算法和规范上分析 Java 中的垃圾回收,属于方法论.在 JVM 中,垃圾回收的具体实现是由 垃圾回收器(Garbage Collector)负责. 正文 概述 在了解 垃圾回收器 之前,首先得了解一下垃圾回收器的几个名词. 1. 吞吐量 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值.比如说虚拟机总运行了 100 分钟,用户代码 时间 99 分钟,垃圾回收 时间 1 分钟,那

Jvm垃圾回收器(终结篇)

知识回顾: 第一篇<Jvm垃圾回收器(基础篇)>主要讲述了判断对象的生死?两种基础判断对象生死的算法.引用计数法.可达性分析算法,方法区的回收.在第二篇<Jvm垃圾回收器(算法篇)>中主要介绍了垃圾回收的几种常用算法:标记-清除.复制算法.标记-整理算法.分代收集算法.那么接下来我们重点研究Jvm的垃圾收集器(serial收集器.parnew收集器.parallel scavenge收集器.serial  old 收集器.parallel old收集器.cms收集器.g1收集器).