jvm之垃圾回收器

一、垃圾回收器简介

1、概念:垃圾回收器是用来自动管理虚拟机中内存的,包括自动分配和自动回收的功能,免去了由程序员来释放内存的麻烦。

2、原因:因为由程序员自己释放内存很可能会出现各种问题,如内存泄露或者悬挂引用,从而导致程序终止。

二、常见垃圾回收算法

1、引用计数器法

(1)实现思路:当新的引用指向新的对象时;对象的计数器加1,当引用失效时,对象的计数器减1;当引用计数器的值变为0时,该对象可以被垃圾回收器回收。

(2)优缺点:

I、优点:实现原理非常简单。

II、缺点:不能解决循环引用的孤岛问题。

孤岛问题:假如有三个对象,这三个对象相互引用(此时对象的计数器不为0),但是没有其它对象指向这几个对象,这时这三个对象占着内存不能释放。

2、跟踪法

(1)实现思路:定义一个有向图,把对象看作是图中的每个节点,对象的相互引用是图中节点之间的邻接关系。垃圾回收器从图中的根节点出发遍历图中的节点,

当对象无法到达时,进行垃圾回收。跟踪法解决了孤岛问题,如下图:

三、分代技术(Java HotSpot)

垃圾回收器是基于分代技术进行回收的,即不同代的对象采用不同的回收方法。Java HotSpot虚拟机中包含三代,分别是年轻代、年老代、永久代。

1、年轻代:绝大多数的内存分配回收动作都发生在年轻代。年轻代被划分为三个区域,原始区(Eden)和两个小的存活区(Survivor),两个存活区按功能分为From和To。绝大多数的对象都在原始区分配,超过一个垃圾回收操作仍然存活的对象放到存活区。

2、年老代:主要存储年轻代中经过多个回收周期仍然存活从而升级的对象。

3、永久代:对于一些大的内存分配,可能也直接分配到永久代。

三、回收器分类

1、并行回收器:回收过程和当前应用程序并行执行。

(1)年轻代:把原始(Eden)区的存活对象移到To区,To区装不下直接移到年老代,把From区的移到To区,To区装不下直接移到年老代,From区里面年龄很大的升级到年老代。回收结束之后,原始(Eden)区和From区都为空,此时把From和To的功能互换,From变To,To变From,每一轮回收之前To都是空的。设计的选型为复制。

(2)年老代:年老代的回收分为三个步骤,标记(Mark)、清除(Sweep)、合并(Compact)。标记阶段把所有存活的对象标记出来,清除阶段释放所有死亡的对象,合并阶段把所有活着的对象合并到年老代的前部分,把空闲的片段都留到后面。设计的选型为合并,减少内存的碎片。

2、串行回收器:暂停当前应用先进行垃圾回收。

同并行回收器

另外还有两种方式:并行合并收集器和并发标记清除回收器,这两种回收器的回收机制有些不同。

时间: 2024-10-09 06:31:02

jvm之垃圾回收器的相关文章

JVM:G1垃圾回收器

http://blog.jobbole.com/109170/ https://blog.csdn.net/baiye_xing/article/details/73743395 G1垃圾收集器关键技术. ===G1垃圾回收器是如何划分堆空间的呢? G1垃圾回收器将内存分成一个个小块区域,这些小块区域的大小可以是1M,2M,4M,8M等等,并且这些小块区域可以是eden,survivor,old,以及humongous区域.其中humongous用来存大对象,如果一个对象超过某块空间的1/2的时

JVM 的垃圾回收器详解

Parallel Scavenge(Paraller):Parallel Scavenge和ParNew关注的点不一样:ParNew关注的是尽可能缩短暂停的时间,Parallel Scavenge关注的是吞吐量吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间)举个例子:虚拟机运行100分钟,GC用了1分钟,吞吐量则为99%.停顿时间短的适合用户交互的程序(web前端应用),提高用户体验度.关注吞吐量,什么样的程序下关注吞吐量而不是非常注重交互及时性,主要是这种后台计算任务.Para

[Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式在内存中存放对象: (1)为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或者静态存储区域内来实现.这种方式牺牲了灵活性. (2)在被称为堆的内存池中动态地创建对象.在这种方式,知道运行时才知道对象需要多少对象,它们的生命周期如何,以及它们的具体类型.

java垃圾回收器http://blog.163.com/[email protected]/blog/static/112515561200942024256658/

内存是稀缺的资源,哪怕内存一块钱一条!如果在编程中使用不当,再大的内存也会耗光.     一.认识Java的自动垃圾回收 垃圾回收是Java语言的一大特性,方便了编程,是以消耗性能为代价的.而垃圾在这里只无用的对象.而C++是需要程序员自己写析构函数来释放内存的,麻烦,也有可能忘记而导致内存泄露. Java语言对内存的分配管理是通过JVM内部机制决定的.程序员可以不关心其处理.     二.垃圾回收的原理和意义 Java虚拟机中有个称之为垃圾回收器的东西,实际上这个东西也许真正不存在,或者是已经

垃圾回收器种类

在这篇教程中我们将学习几种现有的垃圾回收器.在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作.这篇是垃圾回 收教程系列的第三篇,在前面的第2部分我们看到了在Java中垃圾回收是如何工作的,那是篇有意思的文章,我推荐你去看一下.第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java术语. Java有四种类型的垃圾回收器: 串行垃圾回收器(Serial Garbage Collector) 并行垃圾回收器(Parallel Garba

Java GC 垃圾回收器的类型小结

阅读了java paper的垃圾回收器类型文章,在此做一个小结,文章部分翻译自java paper gc collector,部分自己做的总结,图片来自网络,在此仅用作理解表达之用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为四种类型: (图片来自网络) 1.串行垃圾回收器  Serial Garbage Collector 串行垃圾回收器在进行垃圾回收时,它会持有所有应用程序的线程,冻结所有应用程序线程,使用单个垃圾回收线程来进行垃圾回收工作. 串行垃圾回收器是为单线程环境而

Java GC系列(3):垃圾回收器种类

本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作.这篇是垃圾回 收教程系列的第三篇,在前面的第2部分我们看到了在Java中垃圾回收是如何工作的,那是篇有意思的文章,我推荐你去看一下.第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java

[Java基础]-- Java GC 垃圾回收器的分类和优缺点

https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 所属专栏: Java 版权声明:尊重原创,转载请标明,本文转自 https://blog.csdn.net/high2011/article/details/80177473 关于Java的垃圾回收器,一直是个头疼的问题,这里简要说明下分类和优缺点,供选择使用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为六种类型: 1.串行:

JVM中的G1垃圾回收器

我们先回顾一下主流Java的垃圾回收器(HotSpot JVM).本文是针对堆的垃圾回收展开讨论的. 堆被分解为较小的三个部分.具体分为:新生代.老年代.持久代. 绝大部分新生成的对象都放在Eden区,当Eden区将满,JVM会因申请不到内存,而触发Young GC ,进行Eden区+有对象的Survivor区(设为S0区)垃圾回收,把存活的对象用复制算法拷贝到一个空的Survivor(S1)中,此时Eden区被清空,另外一个Survivor S0也为空.下次触发Young GC回收Eden+S