关于应用分类表格如下:
代码展示:包含了强,软,弱,虚各部分的代码展示:
具体使用场景:对应的类源码都有介绍哈,可以尝试阅读并且结合自己的理解去写一些demo出来! * Soft reference objects, which are cleared at the discretion of the garbage * collector in response to memory demand. Soft references are most often used * to implement memory-sensitive caches.
垃圾回收的代码打印 vm option 配置:
-XX:+PrintGCDetails -Xmx10m -Xms10m
package com.special.leetcode.reference;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
/**
* 模拟ThreadLocal为什么在gc是Entry<ThreadLocal,Object>中的key为何没有别回收呢?
*/
public class ReferenceTest {
public static void main(String[] args) {
// 统一的进行对应的方法的调用
// ReferenceTest.weakdemo();
// ReferenceTest.softdemo1();
ReferenceTest.phanDemo();
}
/**
* 强引用很简单就像我们最新的这个案例进行就可以
*/
public static void strongdemo() {
final byte[] bytes = new byte[1024 * 1024];
}
/**
* 软引用 内存不足的时候会回收
* 类的原理:
*/
public static void softdemo() {
final SoftReference<String> hello_soft_test = new SoftReference<>(new String("hello soft test"));
System.out.println(" before gc " + hello_soft_test.get());
System.gc();
System.out.println("aftre gc " + hello_soft_test.get());
}
/**
* 软引用2 内存不足的时候会回收
* 类的原理:
*/
public static void softdemo1() {
final SoftReference<Byte[]> hello_soft_test = new SoftReference<>(new Byte[1024 * 1024]);
System.out.println(" before gc " + hello_soft_test.get());
int i = 0;
ArrayList<Byte[]> softdemo = new ArrayList<>();
while (true) {
Byte[] bytes = new Byte[1024 * 1024];
softdemo.add(bytes);
System.out.println(++i + " allow memory -> " + hello_soft_test.get());
}
}
/*
弱引用 注意threadlocal类用到了这个,但是提示使用的
*/
public static void weakdemo() {
TTOO t = new TTOO();
WeakReference<TTOO> weakReference = new WeakReference<TTOO>(t);
System.out.println(" t = null before----");
System.out.println("refenrence 已经被回收了么!" + weakReference.get() == null);
t = null;
System.out.println("gc before ---之前");
System.gc();
if (weakReference.get() == null) {
System.out.println("weakReference已经被GC回收");
} else {
System.out.println(weakReference.get());
}
while (true) {
}
}
/**
* 虚引用对象
* queue gc之后放入到对应的对象中,
* 都说用来通知,等,那finally是用来干嘛的
* 有说:Java 团队进行对象回收的的跟踪的
*/
public static void phanDemo() {
final ReferenceQueue<Object> queue = new ReferenceQueue<>();
final PhantomReference<person> liuyucaho = new PhantomReference<>(new person("liuyucaho", 12), queue);
System.out.println(" reference before " + liuyucaho.get());
System.out.println(" reference before " + queue.poll());
System.gc();
System.out.println(" reference after " + liuyucaho.get());
// 可以看到回收之后放到了对应的队列中
System.out.println(" reference after " + queue.poll());
}
}
class TTOO {
}
class person {
private String name;
private int age;
public person(String name, int age) {
this.name = name;
this.age = age;
}
}
参考的B站视频: