Java--垃圾收集算法及内存分配策略
本篇博客,主要介绍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--垃圾收集算法及内存分配策略的更多相关文章
- 【java基础 8】垃圾收集算法及内存分配策略
本篇博客,主要介绍GC的收集算法以及根据算法要求所得的内存分配策略! 一.收集算法 收集算法,主要包括四种,分别是:Mark-Sweep(标记-清除).Copying(复制).Mark-Compact ...
- Java垃圾收集器与内存分配策略
程序的计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈中的栈侦随着方法的进入和退出而有条不紊地执行出栈和如栈操作. 判断对象是不是已经死亡的方法: 一.引用计数算法: 给对象添加一个引用 ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- 深入理解java虚拟机_第三章(上)----->垃圾收集器与内存分配策略
1. 前言 这一版块内容比较多,分为两篇文章来做笔记.本文讲述上半部分垃圾收集部分;下一篇文章写内存分配部分. 概述 对象已死吗? 引用技术算法 可达性分析算法 再谈引用 两次标记 回收方法区 2. ...
- 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)
1. 前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 2. 垃圾 ...
- 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略
前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...
- Java垃圾回收算法和内存分配策略
垃圾回收算法和内存分配策略 Java垃圾回收 垃圾收集,也就是GC并不是Java的伴生物,而对于GC的所需要完成任务主要就是: 1.哪些内存是需要回收的? 2.何时去回收这些内存? 3.以何种方式去回 ...
- 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略
垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第三章 ,为了整理思路,简单记录一下,方便后期查阅. 3.2 对象已死吗 在垃圾收集器进行回收 ...
- 《深入理解java虚拟机》第三章 垃圾收集器与内存分配策略
第三章 垃圾收集器与内存分配策略 3.1 概述 哪些内存需要回收 何时回收 如何回收 程序计数器.虚拟机栈.本地方法栈3个区域随线程而生灭. java堆和方法区的内存需要回收. 3.2 对象已死吗 ...
- Java虚拟机垃圾收集器与内存分配策略
Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...
随机推荐
- Android onLoadFinished与onLoaderReset
onLoadFinished 这个方法是在前面已创建的加载器已经完成其加载过程后被调用,这个方法保证会在应用到加载器上的数据被释放之前被调用.在此方法中,你必须删除所有对旧数据的使用(因为它将很快会被 ...
- Diskpart工具应用两则:MBR/GPT分区转换 & 基本/动态磁盘转换
将基本磁盘转换为动态磁盘可直接在操作系统的磁盘管理中完毕,如图1所看到的,这一转换过程对硬盘上的数据没有影响,可是可能会影响到系统的启动(盗版系统激活会受影响). 图1:基本磁盘转换为动态磁盘 要注意 ...
- Delegates, Events and Singletons with Unity3D – C#
在这里我将演示怎样创建代表. 事件和Singletons 在一起工作. 本教程为 Unity3D 编写. 我想知道这为什么?作为一个年轻的自学程序猿,我常常发现自己写tons 和布尔的语句,以确 ...
- redis学习笔记之虚拟内存
首先说明下redis的虚拟内存与os的虚拟内存不是一码事,但是思路和目的都是相同的.就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的 内存空间用于其他需要访问的数据.尤其是对于redis这 ...
- opencv播放不了AVI视频的问题
有些avi视频的编码可能不是Cinepak Codec by Radius编码格式的,需要转换成这种格式. 我用的是swf转avi视频,在转变换时----->设置---->AVI视频设置- ...
- Socket编程模型之完毕port模型
转载请注明来源:viewmode=contents">http://blog.csdn.net/caoshiying?viewmode=contents 一.回想重叠IO模型 用完毕例 ...
- 【AJAX】AJAX实现搜索信息自己主动推荐并补全
好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完.我们在搜索引擎中输入文字时文本框下会提示对应的信息,这个案例就是实现这样的基本功能,代码比較粗糙还须要进一步完好,当中有些地方也须要向 ...
- tig install ncursesw
./configure --prefix=/home/xxx/.local/ --with-ncursesw make[xxx$ ldd src/tig linux-vdso.so.1 => ( ...
- 让Apache 和nginx支持跨域訪问
1,怎样让Apache支持跨域訪问呢? 步骤: 改动httpd.conf,windows中相应的文件夹是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf ...
- python 设计模式之 单例模式
单例模式是做为"全局变量"的替代品出现的.所以它具有全局变量的特点:全局可见.贯穿应用程序的整个生命期,保证在程序执行中,某个类仅仅存在一个实例,所以通常不希望类中的构造函数被调用 ...