虚拟机JVM垃圾回收
2021-04-25 09:20:48 14 举报
AI智能生成
自己首篇总结的文档,喜欢的话放进你的硬盘吃灰吧,对了,顺便给个赞吧,谢谢啦
作者其他创作
大纲/内容
什么是垃圾回收
释放垃圾占用的空间,防止内存泄漏<br>
怎么定义垃圾
引用计数算法<br>
原理<br>
每个对象中都有一份空间储存对象被引用<br>的次数当次数为0时,就会被JVM回收
弊端
如果有两个对象相互引用,<br>那么这个对象就永远不会被回收
可达性分析算法
原理
通过一些被称为引用链(GC Root)的对象作为起点,从这些<br>起点开始向下搜索,当没有引用链相连时,就会被JVM回收
GC Root
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中(即一般说的Native方法)引用的对象
怎么回收垃圾
标记清除算法
原理<br>
把内存区域中的对象进行标记,<br>区分出垃圾,然后进行清理
弊端
会出现很多碎片内存,比如回收一个1M对象,<br>但新对象为2M就不能放入这个碎片内存中
复制算法
原理
内存分为大小相等的两部分,当一部分用完时,将存活<br>的对象全部移动到另一部分,再将原来部分全部清空
弊端
只能使用一半的内存,代价较高
标记整理算法
原理
在标记清除算法的基础上,让所有存活的对<br>象向一端移动再清理掉端边界以外的内存区域
弊端
对内存变动频繁,需要整理所有存活对象的<br>引用地址,在效率上比复制算法要差很多
分代收集算法
原理
严格来讲不是一个思想或理论,<br>而是针对不同情况采用不同算法
作用
新生代
有大量对象死去,少量存活,<br>所以使用复制算法,效率最高
老年代
对象存活率高,没有额外空间进行分配担保,<br>所以可用标记清除,标记整理算法
内存模型
堆内存模型
Eden(伊甸区)
<b> From<br>Survivor(幸存区)</b>
<b> To<br>Survivor(幸存区)</b>
<b>Old(养老区)</b>
区域占用空间
堆空间=新生代(1/3)+老年代(2/3)
新生代=Eden(8/10)+From(1/10)+to(1/10)
回收策略
Eden区
此区域中98%的对象都是朝生夕死,在内存满时会发起一次MinorGC,通过MinorGC后,<br>Eden区的绝大部分对象会被回收,剩余的将会跟随From中对象进入To区
Survivor区
From
进行MinorGC后,会与Eden区的存活对象一起进入To区
To
在To区进行第二次MinorGC后,与Form区职责互换,如此反复
OId
老年代占据着 2/3 的堆内存空间,只有在 Major GC 的时候才会进行清理
移送老年代条件
只有经历 16 次 Minor GC 还能在新生代中存活的对象
Survivor 空间中相同年龄所有对象大小的总合大于 Survivor 空间的一半,<br>那么他本身和比这个年龄大的对象直接进入老年代
养老区
大对象
指大量连续内存空间的对象,直接进入养老区
分类类型
MinorGC
当新生代Eden区没有足够的空间进行分配时,触发MinorGC,通过复制算法清理占用空间
MajorGC
当养老区内存占满的情况下,才触发MajorGC,通过标记清除,标记整理清理占用空间,<br>速度比Minor GC慢10倍以上.
FullGC
老年代空间不足时Full GC, 如果还是不足, 则抛出OOM异常
收藏
0 条评论
下一页