目录
1.总结
引用类型 | 回收时机 |
---|---|
强引用 | 宁愿发生内存溢出也不会回收 |
软引用 | 当内存不够时,会回收这种方式引用的对象,适合做缓存 |
弱引用 | 不管内存够不够,每次进行 GC 都会回收这种方式引用的对象,ThreadLocal 用到了这种引用 |
虚引用 | 这种引用对象一创建就被回收了 |
2.强引用
这种方式引用的对象,宁愿发生内存溢出也不会回收。
2.1.代码
# 添加 jvm 启动参数,-Xmx7m
public static void main(String[] args) throws IOException {
byte[] bytes = new byte[1024 * 1024 * 4];
System.out.println("bytes = " + bytes);
byte[] bytes1 = new byte[1024 * 1024 * 4];
System.out.println("bytes1 = " + bytes1);
}
2.2.运行结果:
bytes = [B@677327b6
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.example.untitled.UntitledApplication.main(UntitledApplication.java:10)
2.3.内存表现方式
3.软引用:
当内存不够时,会回收这种方式引用的对象,适合做缓存。
3.1代码
# 添加 jvm 启动参数,-Xmx7m
public static void main(String[] args) throws InterruptedException, IOException {
SoftReference<byte[]> sf = new SoftReference<>(new byte[1024 * 1024 * 4]);
System.out.println("sf.get() = " + sf.get());
System.gc();
Thread.sleep(5000);
System.out.println("sf.get() = " + sf.get());
byte[] bytes = new byte[1024 * 1024 * 4];
System.out.println("bytes = " + bytes);
System.out.println("sf.get() = " + sf.get());
SoftReference<byte[]> sf1 = new SoftReference<>(new byte[1024 * 1024 * 4]);
System.out.println("sf1.get() = " + sf1.get());
System.in.read();
}
3.2.运行结果
sf.get() = [B@677327b6
sf.get() = [B@677327b6
bytes = [B@14ae5a5
sf.get() = null
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.example.untitled.UntitledApplication.main(UntitledApplication.java:26)
3.3.内存表现方式
4.弱引用
不管内存够不够,每次进行 GC 都会回收这种方式引用的对象,ThreadLocal 用到了这种引用。
4.1.代码
# 添加 jvm 启动参数,-Xmx7m
public static void main(String[] args) throws InterruptedException {
WeakReference<byte[]> wr = new WeakReference<>(new byte[1024 * 1024 * 4]);
System.out.println("wr.get() = " + wr.get());
System.gc();
Thread.sleep(5000);
System.out.println("wr.get() = " + wr.get());
}
4.2.运行结果
wr.get() = [B@677327b6
wr.get() = null
4.3.内存表现方式
5.虚引用
对象一创建就回收了
5.1.代码
public static void main(String[] args) {
ReferenceQueue<? super byte[]> queue = new ReferenceQueue<>();
PhantomReference<byte[]> pr = new PhantomReference<>(new byte[1024 * 1024 * 4], queue);
System.out.println("pr.get() = " + pr.get());
}
5.2.运行结果
pr.get() = null