Java内存垃圾收集

2020-09-09  本文已影响0人  雁阵惊寒_zhn

如何判断对象可以回收?

Java的引用

JDK1.2之后对Java引用进行了扩充,分为强引用、软引用、弱引用和虚引用
强引用>软引用>弱引用>虚引用

System.out.println("-------Strongly Reference--------");
int[] t1 = new int[10240000];
System.gc();
强引用GC日志

日志中可以看到在Full GC之后,对象仍旧存在。

System.out.println("-------Soft Reference-----------");
SoftReference t2 = new SoftReference<>(new int[10240000]);
System.gc();
软引用GC日志

Full GC之后软引用的对象仍旧存在。但是如果连续分配大内存对象,在分配失败,内存溢出前会进行清理。

System.out.println("-------Soft Reference-----------");
SoftReference t2 = new SoftReference<>(new int[512000000]);
SoftReference t3 = new SoftReference<>(new int[512000000]);
System.gc();
GC清理软引用
System.out.println("-------Weak Reference-----------");
WeakReference t3 = new WeakReference<>(new int[10240000]);
System.gc();

弱引用被回收。


弱引用GC日志

对象可以自救的finalize函数,但不建议使用

finalize()函数是对象自救的最后一次机会,覆盖finalize()函数,虚拟机会执行这个方法。如果没有覆盖,或者finalize()函数已经执行过,则虚拟机不会再一次执行。finalize()方法只会被系统自动调用一次。

finalize()函数所能做的工作,try-finally或者其他方法都可以实现,不建议使用finalize()函数

上一篇 下一篇

猜你喜欢

热点阅读