【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都发布了,垃圾收集器也是有了很大的进步和发展,因此在此就不再对垃圾收集器进行详细的研究.但其基本的算法思想还是值得我们参考学习 ...
随机推荐
- linux学习笔记汇总
linux 文件系统是采用级层树状的目录结构,采用"/"根目录的方式 目录结构: / 根目录 |---root: 存放root用户相关的文件 ...
- 解决flexpaper读取本地文件问题,JAVA+TOMCAT
flexpaper是不可以用绝对路径的调用本地或项目外的swf文件的,这个我们就有两种方法,一种是把swf和项目放在同一个目录下面,通过相对路径来获取 另一种是在运行项目的tomcat的server. ...
- (六)maven之本地仓库
本地仓库 ① 运行机制: 当用户在pom.xml文件中添加依赖jar包时,maven会先从本地仓库查找,如果这个jar包在本地仓库中找不到,就从中央仓库下载到本地仓库,中央仓库是maven默认 ...
- 激活 IDEA, PyCharm
1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...
- Android之父Andy Rubin:被乔布斯羡慕嫉妒的天才
今年中国掀起一股“苹果热”,智能手机iPhone.平板电脑iPad遭疯抢,一度卖断货.然而,令许多人意想不到的是,在“苹果”的老家——美国市场,智能手机中卖得最火的并不是iPhone,而是Androi ...
- 用border实现三角形的过程
div{ width:100px; height:100px; background:yellow; border-top: 20px solid red; border-right:20px sol ...
- Vue的安装并在WebStorm中运行
一.Vue的安装需要两个支持分别为:nodejs.npm Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...
- 830. Positions of Large Groups@python
In a string S of lowercase letters, these letters form consecutive groups of the same character. For ...
- LuoguP1351 联合权值 (枚举)
题目链接 枚举每个点,遍历和他相邻的点,然后答案一边更新就可以了. 最大值的时候一定是两个最大值相乘,一边遍历一边记录就好了. 时间复杂度.\(O(n)\) #include <iostream ...
- 【Java_多线程并发编程】基础篇——线程状态扭转函数
1. wait() sleep() yield() join()用法与区别 本文提到的当前线程是指:当前时刻,获得CPU资源正在执行的线程. 1.1 wait()方法 wait()方法定义在Objec ...