首页 > 编程知识 正文

说一下 jvm 有哪些垃圾回收算法,jvm工作原理和垃圾回收

时间:2023-05-03 05:32:12 阅读:190100 作者:3423

因为最近在学习JVM的知识,所以特意写学习笔记简单记录知识点。 因为是初步的学习,所以以下本人总结的内容不一定简单准确。 如果有什么错误的话希望你指出来,看到了就改正。 垃圾分析算法功能:分析JVM堆上的哪些对象是“垃圾”

引用计数法

每个对象都有一个引用计数器,一旦被引用,它将为1;如果被取消引用,它将为-1。 执行GC后,引用计数器为0的所有对象都将被视为“垃圾”。

优点:相对于其他垃圾回收算法,标记去除法的实现相对简单。

缺点:两个对象相互引用时,无法清除;

可达性分析算法(主流)

将方法块的静态变量或栈指针变量表的变量作为Root根节点,通过该Root查找其他下级节点,不能到达的对象通过GC进行清理。

垃圾收集算法标记清除算法

标记所有需要回收的对象,并在GC回收时回收所有标记的对象。

优点:简单

缺点:垃圾回收后内存变得不连续,内存区域变得很大。 新创建的大型对象可能会导致存储空间不足。

复制算法(大多JVM的GC都使用这个)

通俗地说,就是将原本存放对象的大区域分割为1个gtdhm和2个Survivor,制作新对象时只使用其中的1个区域gtdhm,gtdhm填满后启动minorGC

优点: GC后的内存空间是连续的。

缺点:由于不将Survivor2分开保管对象,所以实际保管新对象的内存空间变少。 gt dhm : survivor 13360 survivor 2的比例为8:1:1,可用内存减少10%。

标记-整理法

和标记消除方法一样,第一步是首先标记要回收的对象,不同的是在第二步是将活动对象(幸存)移动到存储器一侧。 装载内存就像一排排,要留下的对象都靠前,剩下的就是要回收的对象(垃圾)。

优点:避免了“标记消去法”和“算法复制”的缺点。

坏处:效率低。

虽然分代收集法一书中把这个算法和垃圾收集算法放在一起,但是我觉得分代收集和上面的“垃圾收集算法”有一点本质的区别。 前者为GC的设计方式,后者为GC回收的具体思路。

堆内存分为jqdxg世代和老年代,其中jqdxg世代一般分为eden和Survivor。 在jqdxg世代的gc中为minorGC,老世代的称为majorGC/fullGC,新制作的对象为jqdxg世代,在经历了n次minorGC之后(n为大小可调整,默认15 ),过渡到旧世代

jqdxg世代地区与旧时代地区的比率一般为1:2。 两个区域的垃圾收集算法可以都不同,jqdxg世代一般为“复制算法”,老年世代为“标记-整理法”。

为什么jqdxg代使用“复制算法”,老年代使用“标记-整理法”?

在Java程序中,大多数对象都是“早晚死”的,而且很快就会被回收,因此jqdxg一代minorGC的触发频率远远高于前代majorGC,这需要更高效的“复制算法”

另外,由于jqdxg世代的eden内存比Survivor内存大,所以在eden的部分对象的生命周期相同,消耗的内存比Survivors多的情况下,即使运行minorGC也能生存,Survivor 此时,老年代起到“担保”的作用,生存的对象直接晋升到老年代。 同样,“算法副本”需要有人担保。 这也是旧时代使用“标签整理法”的理由之一。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。