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