本篇博客,主要介绍GC的收集算法以及根据算法要求所得的内存分配策略!

一、收集算法

收集算法,主要包括四种,分别是:Mark-Sweep(标记-清除)、Copying(复制)、Mark-Compact(标记-整理)、Generational Collection(分代收集)

1.1,Mark-Sweep

这种算法包括两个阶段,首先标记出所有需要回收的对象,然后再标记完成后统一回收掉所有被标记的对象

缺点:效率:标记和清除过程的效率都不高;空间:标记清除之后,会产生大量不连续的内存碎片,空间碎片太多的话,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。

图示:

1.2,Copying

思想:将内存按容量代销分为相等(或根据需要,分为不等)的两块,每次只使用其中一块, 当这一块用完后,将存活对象复制到另一块,然后将之前使用的那块内存空间全部清理!

优点:没有碎片产生,实现简单,运行高效

缺点:内存缩小为原来的一半

图示:

1.3,Mark-Compact

这是一种根据老年代的特点提出的一种类似标记-清除算法的算法,它的区别在于,标记-整理算法,在标记后,并不是清理死亡对象,而是将存活对象移向同一边,然后清理掉边界外的内存

这种算法,可以粗略的理解为前两种算法的结合体

图示:

1.4,Generational Collection

我们都知道在heap里面,可以分为新生代、老年代,也可以更细分为:伊甸园、幸存者、老年区,这种算法,则是根据各个年代的特点,分别采用不同的算法,其算法要求如下:

新生代(伊甸园、幸存者):复制算法,原因如下:大量的对象死亡,只有少量存活。优点:每次收集只需要通过复制少量存活对象即可完成收集

老年代:标记-清理或者标记-整理算法,原因如下:对象存活率高,没有额外空间对它进行分配担保

二、分配策略

根据一中所介绍到的内存在不同区域里面采用的GC算法,那么,为了更进一步的提升效率,可以在创建对象的时候,将对象分配到合适的区域,这样可以减少GC的工作(简单的例子:老年代的对象,并不是一开始就在老年代,是经过GC的扫描,然后被确定为幸存者,一步一步走入老年代,如果我们能确认一些对象的属性,可以在一开始将这个对象植入老年代,减少GC的工作量)

具体分配策略:

1,大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够的空间时,虚拟机将发起一次Minor GC(在新生区非常频繁的回收工作,相对的是Full GC(Major GC)——老年区相对频率小的回收工作)

2,大对象直接进入老年代:大对象是指需要大量连续内存空间的java对象,典型:很长的字符串、数组。

3,长期存活对象进入老年代,如果对象在Eden区出生,并经过第一次Minor GC后仍然活着,并且能够被Survivor容纳,将被移入幸存者区,这时候,它的年龄由0变为1岁,对象在幸存者区每熬过一次Minor GC,年龄就增加一岁,当年龄增加到一定程度(默认15岁),进入老年区。

备注:并不是年龄达到15岁,才可以进入老年区,特殊情况:当幸存者区空间中相同年龄对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象就可以直接进入老年区!

三、总结

其实这个内存分配和回收机制,就跟特么的跟毁容进医院看病一样:

刚开始的时候,大家都看不出来谁跟谁,所以一并放入普通病房(伊甸园),然后呢,医院(垃圾回收器)就开始找你谈话了,因为人多嘛,就先粗略的划分一下贫富,穷的呢(没人引用—没有后续援助)则待在普通病房等着die,有钱的(有人引用—有后续援助),就熬过了第一波救助,进入了高级病房(幸存者区)。呵呵,不要以为这样就可以把病治好了,

这时候,医院又派人来问啦:你们都有多少钱啊(你们各自都有多少的对象引用啊),根据统计结果,嗯,特别有钱的(引用特别多—后续援助特别充足的),进入到VIP病房(老年区)这时候,恢复容貌完全没问题,而那种稍微有点钱的,肯定没有超级富豪经得住医院(GC)的一次又一次的压榨(Minor GC),所以,过不了多久,就会死了!当然如果人数众多(10个中等富豪加一起也能抵一个超级富豪,是吧),为了不触犯众怒,这些人又会被移入VIP病房。

可是,千万不要以为进入了VIP病房,就可以又恢复容貌,又能整得沉鱼落雁、闭月羞花还长生不老了,医院(GC)的检查机制可也不是盖的,总有一天会检查出你是否还有钱(是否还有对象引用),如果没有,直接Kill你,腾出地方,给新一波的富豪们。

如此,反复!  ——PS:厉害了,我的垃圾收集器!

Java--垃圾收集算法及内存分配策略的更多相关文章

  1. 【java基础 8】垃圾收集算法及内存分配策略

    本篇博客,主要介绍GC的收集算法以及根据算法要求所得的内存分配策略! 一.收集算法 收集算法,主要包括四种,分别是:Mark-Sweep(标记-清除).Copying(复制).Mark-Compact ...

  2. Java垃圾收集器与内存分配策略

    程序的计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈中的栈侦随着方法的进入和退出而有条不紊地执行出栈和如栈操作. 判断对象是不是已经死亡的方法: 一.引用计数算法: 给对象添加一个引用 ...

  3. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  4. 深入理解java虚拟机_第三章(上)----->垃圾收集器与内存分配策略

    1.  前言 这一版块内容比较多,分为两篇文章来做笔记.本文讲述上半部分垃圾收集部分;下一篇文章写内存分配部分. 概述 对象已死吗? 引用技术算法 可达性分析算法 再谈引用 两次标记 回收方法区 2. ...

  5. 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

    1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾 ...

  6. 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略

    前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...

  7. Java垃圾回收算法和内存分配策略

    垃圾回收算法和内存分配策略 Java垃圾回收 垃圾收集,也就是GC并不是Java的伴生物,而对于GC的所需要完成任务主要就是: 1.哪些内存是需要回收的? 2.何时去回收这些内存? 3.以何种方式去回 ...

  8. 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第三章 ,为了整理思路,简单记录一下,方便后期查阅. 3.2 对象已死吗 在垃圾收集器进行回收 ...

  9. 《深入理解java虚拟机》第三章 垃圾收集器与内存分配策略

    第三章 垃圾收集器与内存分配策略 3.1 概述 哪些内存需要回收 何时回收 如何回收 程序计数器.虚拟机栈.本地方法栈3个区域随线程而生灭. java堆和方法区的内存需要回收.   3.2 对象已死吗 ...

  10. Java虚拟机垃圾收集器与内存分配策略

    Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...

随机推荐

  1. 工欲善其事必先利其器--------搭建Android平台

    工欲善其事必先利其器--------搭建Android平台 1.1            安装JDK 在Eclipse的开发过程中需要JDK或JRE的支持,否则会报错. (1)     下载JDK(建 ...

  2. iOS开发 - Quartz2D画图

    Quartz 2D简单介绍 是一个二维画图引擎,同一时候支持iOS和Mac系统 Quartz 2D能完毕的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

  3. 在Qtcreator中,KDE的Hello World(安装kdelibs5-dev)

    我刚开始为KDE编程,我面临的问题是我不知道KDE项目的pro文件是什么,我有一个想法. 我还尝试了 file: 库 += -lkdeui 我还是找不到KApplication的问题 代码 main. ...

  4. Caffe 安装 Ubuntu14.04+CUDA7.0/7.5(亲测有效)

    自己安装Caffe的过程中,参考了很多资料,但由于版本或者其他原因,安装过程中总是遇到这样或者那样的问题,因此留做记录,方便之后查看,也希望对遇到相似麻烦的朋友们提供帮助.  下面我们开始安装吧: 硬 ...

  5. HDU 1280 前m大的数 基数排序

    http://acm.hdu.edu.cn/showproblem.php?pid=1280 题目大意: 给你N(N<=3000)个数(这些数不超过5000),要求输出他们两两相加后和最大的M( ...

  6. jQuery获取多种input值的方法(转)

    获取input的checked值是否为true: 第一种: if($("input[name=item][value='val']").attr('checked')==true) ...

  7. css3-11 如何设置文字的阴影

    css3-11 如何设置文字的阴影 一.总结 一句话总结:text-shadow属性.text-shadow:3px 3px 3px #f0f; 1.text-shadow属性的参数依次是什么意思? ...

  8. ios开发网络学习四:NSURLConnection大文件断点下载

    #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...

  9. 单机/伪分布式Hadoop2.4.1安装文档 2014-07-08 21:16 2275人阅读 评论(0) 收藏

    转载自官方文档,最新版请见:http://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/SingleCluster.h ...

  10. 微擎 plugin 时间插件 图片上传插件不显示 报错 影响下面执行

    可能是版本更新导致的,之前可能不需要 load()->func('tpl');这个方法 现在加上 load()->func('tpl');应该就可以了