【java基础 8】垃圾收集算法及内存分配策略
本篇博客,主要介绍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基础 8】垃圾收集算法及内存分配策略的更多相关文章
- 深入理解Java虚拟机:垃圾收集器与内存分配策略
目录 3.2 对象已死吗 判断一个对象是否可被回收 引用类型 finalize() 回收方法区 3.3. 垃圾收集算法 1.Mark-Sweep(标记-清除)算法 2.Copying(复制)算法 3. ...
- 深入JAVA虚拟机笔记-垃圾收集器与内存分配策略
第三章:垃圾收集器与内存分配 问题:1.哪些内存需要回收 2.什么时候回收 3.怎么回收 回收方法区:
- 《深入理解Java虚拟机》——垃圾收集器与内存分配策略
GC需要完成: 哪些内存需要回收 什么时候回收 如何回收 如何确定对象不再使用 引用计数算法 给对象添加一个引用计数器,当有一个地方引用它时,计数器值进行加1操作:当引用失效时,计数器值进行减1操作: ...
- java虚拟机(六)--垃圾收集器和内存分配策略
目前没有完美的收集器,不同的厂商.版本的虚拟机提供的垃圾收集器会有很大的差别,用户根据自己应用特点和要求组合出各个年代所使用 的收集器.基于jdk1.7Update14之后的虚拟机. HotSpot的 ...
- 深入理解Java虚拟机笔记——垃圾收集器与内存分配策略
目录 判断对象是否死亡 引用计数器算法 可达性分析算法 各种引用 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot算法实现 枚举根节点 GC停顿(Sto ...
- 深入理解java虚拟机(3)垃圾收集器与内存分配策略
一.根搜索算法: (1)定义:通过一系列名为"GC Roots"的对象作为起点,从这些起点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连的时 ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- Java虚拟机垃圾收集器与内存分配策略
Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...
- 垃圾收集器与内存分配策略——深入理解Java虚拟机 笔记二
在本篇中,作者大量篇幅介绍了当时较为流行的垃圾回收器,但现在Java 14都发布了,垃圾收集器也是有了很大的进步和发展,因此在此就不再对垃圾收集器进行详细的研究.但其基本的算法思想还是值得我们参考学习 ...
随机推荐
- python简单脚本-sql字符提取
a="""dr.GetStr("kh"), dr.GetStr("xm"), dr.GetStr("xh"), ...
- php调用c# webservice方法
第一次用,通过,还没深入了解. 首先在php.ini中启用extension=php_soap.dll,重启apache. $Client=new SoapClient("url?wsdl& ...
- 修改本地dns域名对应的 ip
C:\Windows\System32\drivers\etc 打开 hosts 文件 在浏览器 访问 http://a.com,就相当于访问 127.0.0.2 这个ip了
- Android学习总结(十八) ———— SQLite数据库使用
一.基本概念 数据库最经典的四个操作 添加.删除.修改.查找,在处理大量数据的时候使用数据库可以帮我们迅速定位当前须要处理的数据,举个例子 好比现在要实现一个搜索功能 用数据库的话只须要其中一个搜索条 ...
- Android学习总结(十)———— Intent的使用
一.Intent的基本概念 我们已经学习完了Android的四大组件了,在四大组件中我们用得最多的是Intent-Filter.Intent含义就是你想利用它调用哪个组件实现相关的功能,比如调用相机组 ...
- COGS 615. 韩国明星
[问题描述] 在LazyCat同学的影响下,Roby同学开始听韩国的音乐,并且越来越喜欢H.o.T,尤其喜欢安七炫和Tony,可是,爱学习爱思考的Roby同学想,如果以后喜欢的韩星越来越多怎么办呢?R ...
- iphone图片简单处理
使用sips批量缩放图片大小 >>sips -s format jpeg -Z 250 someImage.PNG --out myImage.JPEG 把someImage.PNG转换为 ...
- 机器学习之 PCA (二)
参考 http://www.cnblogs.com/frombeijingwithlove/p/5931872.html
- python 基础之运算符
运算符 a=10 ,b=20 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘 ...
- Socket通讯简易学习
Socket打开通信通道,告诉本地机器,愿意在该通道上接受客户请求——监听,等待客户请求——接受请求,创建专用链接进行读写——处理完毕,关闭专用链接——关闭通信通道(当然其中监听到关闭专用链接可以重复 ...