首页 > 其他分享 >软引用使用

软引用使用

时间:2023-05-27 15:57:16浏览次数:22  
标签:1024 list System 引用 使用 new out

概述

软引用:内存不足时,如果GC Root只有软引用,执行gc时会被回收

例子

/**
 * @Author liufq
 * @Date 2023/5/27
 * @Desc 软引用使用,内存不足时,如果GC Root只有软引用,执行gc时会被回收
 *
 * 虚拟机参数:-Xmx20m -XX:+PrintGCDetails -verbose:gc
 */
public class SoftReferenceTest {

    public static void main(String[] args) {
        t3();
    }

    public static void t1() {
        List<byte[]> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(new byte[4 * 1024 * 1024]);
        }
    }

    /**
     * list -> SoftReference -> byte[]
     */
    public static void t2() {
        List<SoftReference<byte[]>> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            System.out.println("第" + i + "次");
            list.add(new SoftReference<>(new byte[4 * 1024 * 1024]));
            list.forEach(e -> System.out.println(e.get()));
        }
    }

    /**
     * 关联引用队列
     * gc回收软引用指向的对象后,软引用被放入引用队列中,可以遍历队列对软引用做操作
     */
    public static void t3() {
        List<SoftReference<byte[]>> list = new ArrayList<>();
        ReferenceQueue<byte[]> queue = new ReferenceQueue();
        for (int i = 0; i < 5; i++) {
            System.out.println("第" + i + "次");
            list.add(new SoftReference<>(new byte[4 * 1024 * 1024], queue));
            list.forEach(e -> System.out.println(e.get()));
        }

        //list中删除引用对象已经被回收的软引用
        Reference<? extends byte[]> reference = queue.poll();
        int i = 0;
        while (reference != null) {
            list.remove(reference);
            reference = queue.poll();
            i++;
        }

        //引用队列大小为4,最后一个不需要回收
        System.out.println("引用队列大小:" + i);

        //剩下最后一个
        list.stream().forEach(System.out::println);
    }
}

标签:1024,list,System,引用,使用,new,out
From: https://www.cnblogs.com/assembly--/p/17436843.html

相关文章

  • 四种引用类型
    强引用:普通对象的强引用关系。如:直接的赋值语句:Stringstr=newString(“string”);强引用不会被垃圾回收。软应用:当内存不足时,具有软引用关系的对象会被垃圾回收。弱引用:不管内存足不足,都会被垃圾回收。虚引用:虚引用通常配合引用队列来使用,用于跟踪对象被垃圾回收的活动。......
  • 如何使用CheckBox以获取用户的选择
    如何使用CheckBox以获取用户的选择CheckBox是一个复选框,它有两种状态:选中和非选中。CheckBox可以比较直观的表现用户的选择情况。效果展示示例代码importjava.util.Map;importjava.util.TreeMap;importjavafx.application.Application;importjavafx.geometry.Inse......
  • amzon s3/minio获取预签名上传url,及js使用预签名url上传文件
      $("#btnSubmit").click(function(event){varfile=$("#ipfile")[0].files[0];varcontentType=!!file.type?file.type:"video/x-flv";//请求api接口:调用amzons3/minio的sdk获取临时上传......
  • m基于FPGA的PID控制器实现,包含testbench测试程序,PID整定通过matlab使用RBF网络计算
    1.算法仿真效果vivado2019.2、matlab2022a仿真结果如下:    2.算法涉及理论知识概要        PID控制器产生于1915年,PID控制律的概念最早是由LYAPIMOV提出的,到目前为止,PID控制器以及改进的PID控制器在工业控制领域里最为常见。PID控制器(比例-积分-微分控制器......
  • 简单商品后台管理系统-应用MVC和AJAX,使用Bootstrap
    一个商品后台管理系统-应用了MVC三层设计模式以及AJAX技术,使用Bootstrap模板;是我用于练习Ajax的增删改查写的一个小系统,很简易,但是有助于理解mvc设计模式,并且简单条理清晰使得它是一个好的练习项目;效果展示: 代码部分:index.html<html><head><title>管理系统</titl......
  • 使用SpringMVC 拦截器导致出现@CrossOrigin失效问题解决办法
    非简单请求会发起一个OPTIONS方法的预检请求,这个请求会被拦截器拦截,但是服务器没有给浏览器返回必要的跨域指示信息(比如:“Access-Control-Allow-Origin”----允许哪些请求访问),浏览器没收到指示信息,就认为服务器不允许跨域请求,就会报错。所以需要在拦截器拦截OPTIONS方法的预......
  • 使用fx.Parallel方法并发执行函数时遇到的惰性计算的坑
    错误的写法packagescripts_stroageimport("encoding/hex""fmt""github.com/zeromicro/go-zero/core/fx""math/rand""sync""testing""time")varfns[]func()......
  • 使用 Linux 命令如何恢复被覆盖的文件 All In One
    使用Linux命令如何恢复被覆盖的文件AllInOne数据还原/数据恢复errors#通配符`*`两边有空格,导致所有文件被覆盖bug❌#$fswebcam--no-banner-r1280*720camera-test.jpg❌demos(......
  • Idea 的下载安装和使用
    1.下载https://www.jetbrains.com.cn/idea/download/#section=windows可以先下载社区版本,最终版需要付费。如果想下载之前版本,可以选择其他本版,这里我选择的是2021.3.3的版本;2.导入已经存在的maven项目已经进入的情况:file-->new-->projectfromexistingsource.... ......
  • 使用static_cast进行父类指针转子类指针可能出现的问题
    使用static_cast进行父类指针向子类指针的转换,可能会出现以下问题:如果转换的父类指针并不是指向真正的子类对象,而是指向另一个父类对象,那么转换后的子类指针将指向无效的内存地址,可能导致程序崩溃。如果子类对象中有虚函数或虚继承,static_cast可能会失效,因为它只进行编......