一 GC的一些基本情况:
- GC收集情况:频繁收集年轻代,较少回收老年代,基本不动永久代(元空间),由此可以看到,在GC中,大多数是对堆空间的回收
- 那么在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