「已注销」 2021-01-14 18:13 采纳率: 0%
浏览 53

Java中软引用和强引用

在深入理解Java虚拟机这本书中又这么一段话`只被软引用关联着的对象,在系统将要发生内 存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存, 才会抛出内存溢出异常。`

但是在我动手做实验的时候发现了一个问题,那就是在idea中使用Java8的环境,还是会爆出溢出,但是在Java11中却不会。

 

import java.lang.ref.SoftReference;

public class references {
    public static void main(String[] args) {
        SoftReference<byte[]> m = new SoftReference<>(new byte[1024 * 1024 * 10]);
        System.out.println(m.get());
        System.gc();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(m.get());
        byte[] m2 = new byte[1024 * 1024 * 15];
        System.out.println(m.get());
    }
}
  • 写回答

1条回答 默认 最新

  • JoseKe 2023-03-20 22:34
    关注

    这个问题可能与Java 8和Java 11的垃圾回收机制有关。在Java 8中,垃圾回收器使用的是Parallel Scavenge收集器,它的特点是在进行垃圾回收时会尽可能地利用所有可用的CPU资源,以达到更高的吞吐量。但是,这种垃圾回收器对于软引用对象的处理可能不够及时,导致在内存不足时仍然会抛出内存溢出异常。
    而在Java 11中,垃圾回收器使用的是G1收集器,它的特点是将堆内存分成多个区域,每个区域独立进行垃圾回收,可以更加精细地控制内存的使用。同时,G1收集器对于软引用对象的处理也更加及时,可以更快地将这些对象列入回收范围,避免内存溢出异常的发生。
    因此,建议在使用软引用对象时,尽可能使用较新版本的Java虚拟机,以获得更好的垃圾回收效果。同时,也需要注意软引用对象的使用场景,避免出现内存泄漏等问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?