提示:以下是本篇文章正文内容,下面案例可供参考
一、强引用
在Java中,强引用(Strong Reference)是最常见的引用类型。当我们创建一个对象并将其赋值给一个变量时,实际上就是创建了一个强引用。这意味着只要这个引用变量还存在,垃圾回收器就不会回收它所引用的对象。(除非等于null)
简单来说日常使用的大部分都是强引用,即使OOM也不回收,所以往往是导致内存泄露的元凶
代码如下(示例):
public class Test {
public static void main(String[] args) throws Throwable {
/**
* 虚拟机配置选项
* VM Options :-XX:+PrintGCDetails -Xms10m -Xmx10m
* -XX:+PrintGCDetails:打印 GC 的详细信息
* -Xms10m:设置初始化堆空间大小为 10m
* -Xmx10m:设置最大堆空间大小为 10m
*/
// 强引用
byte[] bytes = new byte[4 * 1024 * 1024];
// 调用 GC
System.gc();
}
}
输出结果(如下):
可以看出 bytes 并没有存储任何数据,仅仅是开辟空间,但是 GC 后仍然存在
二、软引用
在Java中,软引用(SoftReference)是一种特殊类型的引用,它比强引用弱,但比弱引用强。当系统内存不足时,即 JVM 空间即将耗尽,垃圾回收器会优先清理那些只被软引用关联的对象。如果一个对象只剩下软引用,那么在内存充足的情况下,该对象不会被回收;但在内存不足时,这个软引用指向的对象会被垃圾回收器回收以释放内存。
软引用通常用于实现内存敏感的缓存,例如图片缓存。当系统内存紧张时,这些缓存可以被自动清除,从而避免了 OutOfMemoryError 异常的发生,同时,在内存资源相对充足时,又能保持缓存的功能,提高程序性能。
简单来说,就是内存不足才回收
代码如下(示例):
public class Test {
public static void main(String[] args) throws Throwable {
/**
* 虚拟机配置选项
* VM Options :-XX:+PrintGCDetails -Xms10m -Xmx10m
* -XX:+PrintGCDetails:打印 GC 的详细信息
* -Xms10m:设置初始化堆空间大小为 10m
* -Xmx10m:设置最大堆空间大小为 10m
*/
// 软引用
Map<String, SoftReference<byte[]>> map = new HashMap<>();<