JVM垃圾收集算法总结

原创 2015年11月19日 10:38:19

第一次写技术博客,目的很简单,就是总结自己最近学习的一些知识,同时能够分享给大家。如果有什么说的不准确或者不对的地方,请大家尽管直接指出来,大家一起讨论,共同学习。

1、如何判断对象已死?

JVM是否使用了Perl和PHP等语言采用的引用计数算法?No,引用计数算法虽然简单,但存在两个问题:
1)、每次内存对象被引用或引用被销毁时必须修改引用计数,造成整体性能消耗;
2)、出现循环引用时难以处理。
JVM采用的是根搜索算法:通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
在Java语言里,可作为GC Roots的对象包括下面几种:
1)、虚拟机栈(栈帧中的本地变量表)中引用的对象。
2)、方法区中的类静态属性引用的对象。
3)、方法区中的常量引用的对象。
4)、本地方法栈中JNI的引用的对象。

2、基本的垃圾回收算法

1)、标记-清除(Mark-Sweep):

优点:简单
缺点:a)、效率低
b)、产生大量不连续内存碎片

2)、复制算法:

将可用内存按照容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
优点:实现简单,运行高效
缺点:内存利用率减半

3)、标记-整理(Mark-Compact):

标记过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

4)、分代收集算法(当前商业虚拟机使用的收集算法):

根据对象的存活周期的不同将内存划分为新生代和老年代。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中由于对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

如上图所示,JVM堆内存区域被分为新生代,老年代(上图中的永久代不属于堆内存区域,属于方法区)。在新生代内,内存被分为一块儿较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor区域(From和To只是一个逻辑区域,也就是说当上图中左边的Survivor为From Space时,右边的Survivor是To Space,当右边的Survivor为From Space时,左边的就叫To Space;并且除非正在执行垃圾收集,否则总有一个幸存者空间是空的)。

版权声明:本文为博主原创文章,未经博主允许不得转载。

jvm垃圾收集算法

jvm垃圾收集算法有:标记-清除算法,复制算法,标记-整理算法,分代收集算法。 1.标记-清除算法(Mark-Sweep) 最基础的收集算法是“标记-清除”(Mark-Sweep)算法。 ...
  • lidf1992
  • lidf1992
  • 2017年04月12日 14:08
  • 134

【深入理解JVM】:垃圾收集算法

垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep)、复制算法(copying)和标记-整理算法(mark-compact)。标记-清除算法算法的执行过程与名字一样,先标记所有需要回收的...
  • u011080472
  • u011080472
  • 2016年05月05日 16:31
  • 1936

JVM学习笔记3-垃圾收集算法

1.标记-清除算法 顾名思义,就是标记待GC的对象,然后清除掉。这算法有2个问题: 效率问题:标记和清除的效率都不高。 空间问题:因为清除之后会有大量的不连续内存,当分配大内存对象时可能没有...
  • ss36290109
  • ss36290109
  • 2014年11月19日 10:23
  • 281

Jvm常用垃圾收集算法[总结]

Jvm常用垃圾收集算法[总结] 作者:请叫我晁盖 原文:http://blog.csdn.net/u010046451/article/details/79123212 (点击文末阅读原文即...
  • huangshulang1234
  • huangshulang1234
  • 2018年01月27日 09:48
  • 45

JVM 垃圾收集算法

跟踪收集器 跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC  Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC  Roots 没...
  • lmxmimihuhu
  • lmxmimihuhu
  • 2015年07月26日 16:31
  • 215

JVM笔记3:Java垃圾收集算法与垃圾收集器

当前商业虚拟机的垃圾收集都采用“分代收集”算法,即根据对象生命周期的不同,将内存划分几块,一般为新生代和老年代,不同的代根据其特点使用不同的垃圾收集算法,主要的垃圾回收算法有:一,标记-清除算法 二,...
  • a19881029
  • a19881029
  • 2013年10月22日 09:37
  • 2902

jvm垃圾收集算法·

一、判断对象是否存活 1.引用计数算法   个对象添加一个引用计数器,当有一个地方应用它时计数器加1;当引用失效时,计数器减1;任何时刻计数器为0的对象不可能再被使用。  缺点: ...
  • zengxiaosen
  • zengxiaosen
  • 2017年06月06日 16:17
  • 221

JVM垃圾收集算法

java虚拟机JVM垃圾收集算法有四种:标记-清除算法、复制算法
  • yyywyr
  • yyywyr
  • 2014年09月17日 21:17
  • 2526

[JVM]垃圾收集算法

本文“垃圾收集算法”节选自《深入理解Java虚拟机:JVM高级特性与最佳实践》【作者:周志明】由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此本节不打算过多...
  • SunnyYoona
  • SunnyYoona
  • 2015年06月07日 22:14
  • 737

JVM > 垃圾收集算法

《深入理解Java虚拟机》学习笔记程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生,随着线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊的执行着出栈和入栈操作。这几个区域无需过多考虑回收的问题,...
  • u012006689
  • u012006689
  • 2016年03月04日 11:41
  • 144
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM垃圾收集算法总结
举报原因:
原因补充:

(最多只允许输入30个字)