引用计数与可达性分析

本文介绍了Java中的垃圾回收机制,重点讨论了引用计数算法和可达性分析两种对象存活判断方式。引用计数算法虽然简单高效,但无法处理循环引用问题,而Java采用可达性分析避免这一问题,通过GC Roots确定对象的可达性。同时,文章提到了finalization机制,强调不应手动调用对象的finalize()方法,该方法在适当时候由垃圾回收器调用,影响对象的生命周期状态。
摘要由CSDN通过智能技术生成

一 GC的一些基本情况:

  1. GC收集情况:频繁收集年轻代,较少回收老年代,基本不动永久代(元空间),由此可以看到,在GC中,大多数是对堆空间的回收
  2. 那么在java中,是如何判断一个对象是否是个垃圾呢? 简单来说:当一个对已经不再被任何存活对象继续引用时,就可以宣布为死亡

二 判断对象是否存活的方式:

1.引用计数算法:引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。

例如:有对象objA,与objB,如果objA指向了objB,那么objB中的引用计数器就会+1。当objA对objB的引用失效时,objB的引用计数器就-1.当objB的引用计数器的值为0时,则可以被回收。

附上代码:
package com.cdc.gc.demo;

/**
 * @author cdc
 * @email c925638766@163.com
 * @date 2020/7/29 17:38
 * 测试在java中是否用了引用计数算法标记垃圾
 *  -XX:+PrintGCDetails
 *
 *
 */
public class RFCount {
   
    private byte[] buff=new byte[1024*1024*5];//5MB

    Object reference=null;//引用

    public static void main(String[] args) {
   
        RFCount rfCount1=new RFCount();
        RFCount rfCount2=new RFCount();

        rfCount1.reference=rfCount2;//将对象1的属性指向对象2,构成引用
        rfCount2.reference=rfCount1;//将对象2的属性指向对象1,构成引用

        //解除引用
        rfCount1=null;
        rfCount2=null;

        //System.gc();
    }
}

在这里,首先通过rfCount1指向了堆中的RFCount(),假设该地址为0x1122,rfCount2指向的RFCount()地址假设为0x2233。这时0x1122与0x2233中的引用计数器都为1。之后在通过rfCount1中的reference指向rfCount2,即0x2233的地址再次被指向,引用计数器+1,即为2;同理0x2233的引用计数器也+1。之后再交rfCount1与rfCount2分别=null,即断开引用,引用失效,那么0x1122与0x2233的计数器分别-1,即为1。此时通过-XX:+PrintGCDetails参数,打印GC详细信息。

当System.gc()被注释起来后,即没有显式的调用gc时,控制台打印的信息:
"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" -XX:+PrintGCDetails "-javaagent:F:\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=49753:F:\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;F:\Java自学\jvm\JVMDemo\out\production\JVMDemo;F:\Maven_jars\junit\junit\4.11\junit-4.11.jar;F:\Maven_jars\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar" com.cdc.gc.demo.RFCount
Heap
 PSYoungGen      total 75776K, used 16742K [0x000000076b700000, 0x0000000770b80000, 0x00000007c0000000)
  eden space 65024K, 25% used [0x000000076b700000,0x000000076c759bd0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值