大家好,又见面了,我是你们的朋友全栈君。
JVM中的垃圾回收了解吗
首先是如何标记存活对象,主要有两个算法,分别是引用计数法和可达性分析算法。
- 引用计数法:给一个对象添加一个引用计数器,当一个地方引用它时,计算器 1,不引用的时候-1,当引用计数器为0时说明该对象可回收。但是一旦出现互相引用的情况,就会出现无法回收的现象。所以JVM采用的是可达性分析算法。
- 可达性分析算法:首先会标记所有GC root能够直接关联的对象。GC root能够直接关联的对象包含:Java虚拟机栈中引用的对象,本地方法栈中引用的对象,方法区中静态变量引用的对象和常量池中引用的对象。然后,再进行GC root 的tracing,标记GC root间接关联的对象。
标记完存活对象之后便是是进行垃圾回收,垃圾回收算法主要有三种:标记清除、标记整理、标记复制
- 标记清除:标记存活的对象,然后将垃圾对象直接清除,优点是清除效率高,缺点是内存碎片多
- 标记整理:标记存活的对象,然后将存活的地方移动到一个连续的区域,将该区域外的对象全部清除。缺点是需要移动对象,清除效率比标记清除低。优点是不会产生内存碎片。
- 标记复制:将内存区域分成两个部分,标记存活的对象,将存活的对象复制到另外一个区域,然后将本区域全部清除。缺点是空间利用率不高
JVM垃圾回收机制采用的分代回收,新生代的垃圾回收采用的是标记复制算法,老年代的垃圾回收采用的是标记清除或者标记整理算法。
大多数情况下,对象在新生代Eden区上进行分配,大对象则直接分配到老年代。当Eden区空间不够时,则需要发起Minor GC清理垃圾对象。当对象经过Minor GC依然存活,将移动到Survivor中,年龄 1,增加到一定年龄则移动到老年代中。如果在survivor区中相同年龄的所有对象大小大于survivor空间的一半,则大于或等于该年龄的对象直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄。当老年代空间不足时会进行Full GC。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138578.html原文链接:https://javaforall.cn