List.subList 进行切片操作导致 OOM

59 篇文章 0 订阅
19 篇文章 0 订阅

当使用List中的切片操作时,导致内存溢出错误。

定义一个名为 data 的静态 List 来存放 Integer 的 List,也就是说 data 的
成员本身是包含了多个数字的 List。循环 1000 次,每次都从一个具有 10 万个 Integer 的
List 中,使用 subList 方法获得一个只包含一个数字的子 List,并把这个子 List 加入 data
变量:

    private static List<List<Integer>> data = new ArrayList<>();

        for (int i = 0; i < 1000; i++) {
            List<Integer> rawList = IntStream.rangeClosed(1, 100000).boxed().collect(Collectors.toList());
            data.add(rawList.subList(0, 1));
        }

导致内存溢出,是因为循环中的 1000 个具有 10 万个元素的 List 始终得不到回收,因为
它始终被 subList 方法返回的 List 强引用。这里的subList()方法并不是创建了一个新的集合,而是引用了旧的集合中的元素,导致之间有关系无法被垃圾回收。又由于强引用的特性直至OOM也不会进行垃圾处理

SubList 相当于原始 List 的视图,那么避免相互影响的修复方式有两种

一种是,不直接使用 subList 方法返回的 SubList,而是重新使用 new ArrayList,在构
造方法传入 SubList,来构建一个独立的 ArrayList;
另一种是,对于 Java 8 使用 Stream 的 skip 和 limit API 来跳过流中的元素,以及限制
流中元素的个数,同样可以达到 SubList 切片的目的。

//方式一:
List<Integer> subList = new ArrayList<>(list.subList(1, 4));
//方式二:
List<Integer> subList = list.stream().skip(1).limit(3).collect(Collectors.toList());
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值