java虚拟机(jvm)垃圾收集算法剖析

目前商业虚拟机的垃圾收集都采用“分代收集”算法,这种算法根据对象的存活周期把内存划分为“新生代”和“老年代”。然后根据不同的年

代的特点采取不同的收集算法。在新生代中,由于每次minor GC都发现有很多对象死去,存活的非常少,因此采用复制算法。而老年代中对

象存活率非常的高,而起没有额外的内存空间进行分配担保就采用“标记-清理”或“标记-整理”算法来进行回收。但是基本上使用的“标记-整理”算

法,“标记-清理”算法使用非常的少。

下面对“复制算法”和“标记-整理”算法以图文的方式给大家进行介绍:

一、复制算法(年轻代)


1).原理:

它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当一块用完之后,就将还存活的对象复制到另外一块上面,然

后再把已使用过的内存空间一次清理掉。

2).好处:

每次都是对其中一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只要移动堆顶指针,按顺序分配内存即可,实现简单,

运行高效。

3).缺点:

将内存缩小为原来的一半,浪费了一半的空间。

4).复制过程图(来源于网络)

5).jvm中应用

jvm的年轻代采用的这种回收方式,在jvm中默认把堆空间的年轻代按照8:1:1的比例分为Eden:Survivor:Survivor。每次虚拟机只使用

eden和其中一个Survivor区域。另外一个Survivor空间是空的。当回收的时候,将eden和surivor中还存活着的对象一次性地拷贝到另外一块

surivor空间上,然后对eden和之前使用过的surivor空间进行清理。所以每次新生代能够使用90%的空间。

可能大家有所疑问假如回收还存活的对象占有空间大于10%怎么办?当survivor空间不够用时,可以依赖老年代进行分配的担保。

survivor中不能容纳的对象直接进入老年代。但是前提是老年代还有空间容纳这些对象。如果担保失败,将会进行full gc。

二、标记-整理算法(老年代)


1).原理:

算法分为“标记”、“整理”两个步骤,首先标记出所有需要回收的对象,然后将所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

2).优点:

内存回收不会产生内存碎片。

3).缺点:

需要移动对象,成本相对"标记-清理"算法较高。

4).复制过程图(来源于网络)





5).jvm中应用:

在老年代中因为对象存活率高,没有额外空间对它进行分配担保,必须使用"标记-清理"或“标记-整理”算法进行回收。但是基本上

使用“标记-整理”算法。

注明:

1).“标记-清理”和”标记-整理“非常的相似,只是标记完成后直接对可回收的对象进行清理。这种方式导致了大量的碎片,它也是最基

础的收集算法。

2).文章中使用的图参考于网络(http://blog.csdn.net/java2000_wl/article/details/8022293)。

---------------------------------------------------------------------------版权声明------------------------------------------------------------------------------------------

版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/mr_smile2014

时间: 2024-10-12 05:29:03

java虚拟机(jvm)垃圾收集算法剖析的相关文章

深入理解Java虚拟机笔记---垃圾收集算法

当对象判定为"已死"状态,虚拟就要采取一定的手段将这些对象从内存中移除,即回收垃圾,回收过程有采用一定的算法.如下是一些主要的垃圾收集算法: 1.标记-清除算法 该算法是最基础的算法,分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象.之所有说它是最基础的算法是因为后续的收集算法都是基于这种思路并对其缺点进行改进得到的.它的缺点主要有两个:一个是效率问题,标记和清除过程效率都不高:另外一个是空间问

Java虚拟机学习 - 垃圾收集算法(3)

跟踪收集器 跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC  Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC  Roots 没有任         何引用链时,则证明此对象是不可用的. 下图中,对象Object6.Object7.Object8虽然互相引用,但他们的GC Roots是不可到达的,所以它们将会被判定为是可回收的对象. 可作为GC Roots 的对象包括: 虚拟机栈(栈帧中的本地变量表)中的引用对象. 方法区中的

J深入学习ava虚拟机之——垃圾收集算法与垃圾收集器

今天我们将一起学习Java虚拟机使用垃圾收集算法和常见的垃圾收集器.Java虚拟机内存区域的程序计数器.虚拟机栈和本地方法栈3个区域是随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出出栈和入栈.每一个栈帧中分配多少内存基本上是在类结构确定下来的时候就已知的,因此这个几个区域的内存分配和回收都具备确定性,在这几个区域就不需要过多考虑回收问题,因为方法结束或者线程结束时,内存自然就跟着回收了.而Java堆和方法区就不一样,一个接口中的多个类实现需要的内存可能不一样,一个方法中的多个分支需要的内

《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记 JAVA 环境: JAVA虚拟机高级特性: 一:java内存区域与内存异常 一):运行数据区     1:程序计数器(Program Counter Register),也称"PC寄存器" A:用来指示需要执行哪条指令的.(在汇编语言中,CPU在得到指令之后,程序计数器便自动加1或者根据                    转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令.) B:由于在JVM中,多线程

书籍推荐:《实战Java虚拟机——JVM故障诊断与性能优化》下载

本书详细介绍Java虚拟机的基本原理和优化诊断方法.其中重点介绍Java虚拟机的体系结构.常用的虚拟机参数.Java虚拟机的垃圾回收原理.算法以及目前虚拟机所支持的各种垃圾回收器及其区别.特点和使用方法.在实践和调优方面,重点介绍了Java的堆.栈分析方法,性能调优的一般思路.手段和工具.此外,还详细介绍了虚拟机内有关"锁"的实现以及优化方法. 作为对虚拟机的深入了解,本书还将详细介绍Java类的基本格式.装载过程和虚拟机的执行机制. Java虚拟机目前是Java.Scala.Cloj

JAVA虚拟机垃圾回收算法原理

除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块.新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间.请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间是足够的.这是因为,堆中没有连续的空闲空间放得下新的对象. 垃圾收集器算法 任何垃圾回收算法都必须做两件事,首先,它必须检测出垃圾对象.其次,它必须回收垃圾对象所使用的堆空间并还给程序.从根对象开始,任何可以被触及的对象都被认为是“活动的”对象(如果正在运行的程序可以访问到根对象和某个对象之间

深入Java虚拟机JVM类加载初始化学习笔记

1. Classloader的作用,概括来说就是将编译后的class装载.加载到机器内存中,为了以后的程序的执行提供前提条件. 2. 一段程序引发的思考: 风中叶老师在他的视频中给了我们一段程序,号称是世界上所有的Java程序员都会犯的错误. 一般不假思索的结论就是,a=1,b=1.给出的原因是:a.b都是静态变量,在构造函数调用的时候已经对a和b都加1了.答案就都是1.但是运行完后答案却是a=1,b=0. 为什么呢,这3句无非就是静态变量的声明.初始化,值的变化和声明的顺序还有关系吗?Java

Java虚拟机JVM简单理解

Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系结构包含三个主要的子系统和一个内存区,分别是: 垃圾回收器:用于回收堆(heap)中无引用的对象. 类装载子系统:定位及导入二进制class文件,校验被导入类的正确性,为类变量分配初始化内存,以及帮助解析符号引用. 执行引擎:执行被转载类中的方法指令. 运行时数据区:又叫做虚拟机内存或Java内存.

java虚拟机--JVM

java虚拟机 是安装在计算机操作系统上的一个虚拟计算机. 专门用于处理java程序和底层操作系统的链接工作,将java程序翻译成底层的操作系统可以理解的语言. 有别于JDK.JDK是java的开发环境,是java开发人员需要的,里面除了JVM,还有一些其他的东西.JVM是小于JDK的. JVM的结构图如下图所示: 1. 类加载器:加载类文件到内存.[这里的类文件是class文件] 2. 运行数据区:1中加载的class文件,全部保存在运行数据区.java能够很好的运行,也是得益于运行数据区的管

JVM垃圾收集算法(标记-清除、复制、标记-整理)

 [JVM垃圾收集算法] 1)标记-清除算法: 标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象(错了吧?) 清除阶段:清除所有未被标记的对象 2)复制算法: 将原有的内存空间分为两块,每次只使用一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未被使用的内存块中,然后清除正在使用的内存块中的所有对象. 3)标记-整理算法: 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的为垃圾对象 整理阶段:将所有的存活对象压缩到内存的一段,之后清理边界所有的空间