本篇博客,主要介绍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. [Nuxt] Update State with Vuex Actions in Nuxt.js

    You can conditionally add classes to Vue.js templates using v-bind:class. This will help display the ...

  2. js进阶 12-8 如何知道上一个函数的返回值是什么(如何判断上一个函数是否执行成功)

    js进阶 12-8 如何知道上一个函数的返回值是什么(如何判断上一个函数是否执行成功) 一.总结 一句话总结:event的result属性即可. 1.event的result属性的实际应用场景是什么? ...

  3. POJ 3211 Washing Clothes 0-1背包

    题目大意: xxx很懒,但他有个漂亮又勤奋的女友 (尼玛能不能不刺激我,刚看到这题的时候发现自己的衣服没洗!!!) 可以帮他洗衣服. 洗衣服的时候要求不同的颜色的衣服不能同时洗.一人洗一件的话,问最短 ...

  4. Vue源码--解读vue响应式原理

    原文链接:https://geniuspeng.github.io/2018/01/05/vue-reactivity/ Vue的官方说明里有深入响应式原理这一节.在此官方也提到过: 当你把一个普通的 ...

  5. ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

    如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ...

  6. 群晖synology的Video Station无法通过浏览器在线播放视频

    群晖synology的Video Station无法通过浏览器在线播放视频 http://www.hangge.com/blog/cache/detail_419.html

  7. 在Excel中粘贴时怎样跳过隐藏行

    http://www.excel123.cn/Article/exceljichu/201203/932.html 有时在筛选后需要将其他区域中的连续行数据复制粘贴到筛选区域,以替换筛选后的数据.由于 ...

  8. 小雷FansUnion:我有了第一个付费客户(第一个徒弟)

    很高兴地告诉大家一个振奋人心的消息,我刚刚拥有了第一个付费客户. 第一个付费客户是山东青岛的一个上班族,有2年.Net经验,今年转Java开发.对我比较信任,在我的建议下,选择了"拜师学艺& ...

  9. poj2151之概率DP

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4403   ...

  10. 主从同步设置的重要参数log_slave_updates

    说明:最近部署了mysql的集群环境,详细如下M01和M02为主主复制,M01和R01为主从复制:在测试的过程中发现了以下问题: 1.M01和M02的主主复制是没有问题的(从M01写入数据能同步到M0 ...