java释放list_Java中List集合中subList的坑

参考博主http://blog.csdn.net/xuweilinjijis/article/details/9037635

先看List接口subList方法的javadoc

The returned list is backed by this list, so non-structural

* changes in the returned list are reflected in this list, and vice-versa.

* The returned list supports all of the optional list operations supported

* by this list.

可以看到此方法其实就是直接指向原List集合中的元素,只是改变了开始位置和结束为止而已.如果修改返回对象的数据,那么原对象对应的值也会被修改。

看一下List接口具体实现类 ArrayList类,其中的subList方法源码如下

public List subList(int fromIndex, int toIndex) {

subListRangeCheck(fromIndex, toIndex, size);//检查是否越界

return new SubList(this, 0, fromIndex, toIndex);//返回截取之后的对象

}

再接着看一下 SubList类的构造器,JDK源码如下,其实 SubList就是ArrayList中的一个内部类(非静态的),

private class SubList extends AbstractList implements RandomAccess {

private final AbstractList parent;//引用调用的父集合

private final int parentOffset;//父集合的起始位置

private final int offset;//原对象的起始位置

int size;//现在集合的大小

SubList(AbstractList parent,

int offset, int fromIndex, int toIndex) {

this.parent = parent;//从此处可以看到父集合一直被子集合引用着,只要子集合存在,父集合就不会被释放。从而容易造成内存溢出

this.parentOffset = fromIndex;

this.offset = offset + fromIndex;

this.size = toIndex - fromIndex;

this.modCount = ArrayList.this.modCount;

}

}

下面是一段造成内存溢出的代码

List> cache = new ArrayList>();

try {

while (true) {

ArrayList list = new ArrayList<>();

for(int j=0;j<100000;j++) {

list.add(j);

}

List subList = list.subList(0, 1);

cache.add(subList);

}

} catch (Exception e) {

}finally {

System.out.println("Cache Size=" + cache.size());

}

运行结果

Exception in thread "main" Cache Size=815

java.lang.OutOfMemoryError: GC overhead limit exceeded

at java.lang.Integer.valueOf(Integer.java:832)

at com.effectJava.Chapter2.InstrumentedHashSet.main(InstrumentedHashSet.java:44)

看到只包含815个元素就内存溢出啦。就是因为子对象一只引用着父对象,导致父对象无法回收。从而内存溢出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试题库二级C操作题100套(第38套)

第38套&#xff1a; 函数fun的功能是&#xff1a;把形参a所指数组中的奇数按原顺序依次存放到a[0]、 a[1]、a[2]、……中&#xff0c;把偶数从数组中删除&#xff0c;奇数个数通过函数值返回。例如&#xff1a;若a所指数组中的数据最初排列为&#xff1a;9、1、4、2、3、6、5、…

RestKit

2019独角兽企业重金招聘Python工程师标准>>> Restkit 是一个开源的 objective-c 框架&#xff0c;允许在 iOS 和 Mac OS X 的 Objective-C 中与 RESTful Web 服务进行交互&#xff0c;包含简单的 HTTP request/response API &#xff0c;带有强大的对象映射系统用于…

全国计算机等级考试题库二级C操作题100套(第39套)

第39套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:在形参ss所指字符串数组中&#xff0c;删除所有串长超过k的字符串&#xff0c;函数返回所剩字符串的个数。ss所指字符串数组中共有N个字符串&#xff0c;且串长小于M。 请在程序的下划线处填入正确的内容并把下划线…

java判断是否包含张三_c# 数组 字符串 C#中判断字符串中包含某个字符

Nodejs windows的安装0.下载地址: http://nodejs-org.qiniudn.com/ https://nodejs.org/download/ https://nodejs.org/en/ 1.基本就是一路N ...跨平台网络抓包工具-Microsoft Message AnalyzerMicrosoft Message Analyzer (MMA 2013)是微软最受欢迎的Netmon的最新版本. 在Netm…

python能开发游戏吗_python可以开发游戏吗,python能开发游戏吗

Q2&#xff1a;用python能制作游戏吗 能&#xff0c;但不适合。 用锤子能造汽车吗&#xff1f; 谁也没法说不能吧&#xff1f;地球上也有很多汽车&#xff0c;是用锤子造出来的。。。。但一般来说&#xff0c;还是用工业机器人更合适对吗&#xff1f; 比较大型的&#xff0c;使…

golang log日志

写入日志文件 func main() {file, err : os.Create("test.log")if err ! nil {log.Fatalln("fail to create test.log file!")}logger : log.New(file, "", log.Llongfile)// 写入文件log格式&#xff1a;/Users/zhou/go/src/zhouTest/test.go:2…

[Andriod官方训练教程]保存数据之保存键-值对的集合

原文地址&#xff1a;https://developer.android.com/training/basics/data-storage/shared-preferences.html ------------------------------------------------------------------------------------------------------------------------------- If you have a relatively …

全国计算机等级考试题库二级C操作题100套(第40套)

第40套&#xff1a; 给定程序中已建立一个带有头结点的单向链表&#xff0c;链表中的各结点按结点数据域中的数据递增有序链接。函数fun的功能是&#xff1a;把形参x的值放入一个新结点并插入到链表中&#xff0c;插入后各结点数据域的值仍保持递增有序。 请在程序的下划线处填…

java里面有控制器吗_mvc中 控制器部分可以使用Javabean完成吗?为什么?

模型-视图-控制器(MVC)是80年代Smalltalk-80出现的一种软件设计模式&#xff0c;现在已经被广泛的使用。1、模型(Model)模型是应用程序的主体部分。模型表示业务数据&#xff0c;或者业务逻辑.2、视图(View)视图是应用程序中用户界面相关的部分&#xff0c;是用户看到并与之交互…

python时间计算_python计算两日期之间工作日时长

1. 原因&#xff1a;使用dateutil的rrule时&#xff0c;计算速度比较慢 def axx(): from dateutil import rrule received_time datetime.datetime.strptime(2019-04-21 23:00:00, %Y-%m-%d %H:%M:%S) complete_time datetime.datetime.strptime(2019-04-22 01:00:00, %Y-%m-…

QSlider QLCDNumber 最常用的函数和 信号槽 (以后用到在加)

QLCDNumber : 函数: 槽&#xff1a; display(int); QSlider: 函数: setMinimum(int); setMaximum(int); 信号&#xff1a; valueChanged(int); 转载于:https://www.cnblogs.com/lc-cnblong/archive/2013/02/06/2907680.html

【进阶技术】一篇文章搞掂:Spring高级编程

本文篇幅较长&#xff0c;建议合理利用右上角目录进行查看&#xff08;如果没有目录请刷新&#xff09;。 本文基于《Spring5高级编程》一书进行总结和扩展&#xff0c;大家也可以自行研读此书。 十一、任务调度 任务调度主要由三部分组成 &#xff1a; 任务&#xff1a;即需要…

全国计算机等级考试题库二级C操作题100套(第41套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

2012年终总结 二

2019独角兽企业重金招聘Python工程师标准>>> 接上文。。。 经过一些搜索和了解之后&#xff0c;最后选定了我现在这个公司。现在&#xff0c;至少我没有感觉到我选错。 刚近公司&#xff0c;进行了新人的入职培训1天&#xff0c;这个主要是了解公司状况。而后&…

java核心卷一读书感想_关于JAVA核心技术(卷一)读后的思考(lambda表达式的讨论)...

lambda表达式lambda表达式是一个可传递的代码块。可以以后执行一次或者多次。在程序运行中我们经常会遇到传递代码段的情况&#xff0c;但是我们一般都是先构造一个对象&#xff0c;然后通过对象调用相应的代码块来实现传递代码块的目的&#xff0c;这个方法十分繁琐&#xff0…

POJ 2773 欧几里得

思路&#xff1a; 若a和b互素的话&#xff0c;则b*ta和b一定互素 用周期性做就好了 //By SiriusRen #include <cstdio> using namespace std; int s[1000050],m,k; int gcd(int a,int b){return b?gcd(b,a%b):a;} int main(){while(~scanf("%d%d",&m,&…

python语言包括哪些实现_Python语言基础考察点:python语言基础常见考题(一)

一、python是静态还是动态类型&#xff1f;是强类型还是弱类型&#xff1f; 1、动态强类型语言(不少人误以为是弱类型) 不要傻傻分不清 2、动态还是静态指的是编译期还是运行期确定类型 3、强类型指的是不会发生隐式类型转换 若类型语言强类型语言4、python作为后端语言优缺点 …

全国计算机等级考试题库二级C操作题100套(第42套)

第42套&#xff1a; 给定程序中&#xff0c;函数fun的功能是: 将s所指字符串中的所有数字字符移到所有非数字字符之后&#xff0c;并保持数字字符串和非数字字符串原有的先后次序。例如&#xff0c;形参s所指的字符串为&#xff1a;def35adh3kjsdf7。执行结果为&#xff1a;de…

不同的编译器:GCC G++ C C++的区别

gcc 是c的编译器&#xff0c;g是c的编译器。cc一般是一个符号连接&#xff0c;指向gcc。CC一般是makefile里面的一个名字&#xff0c;具体是什么根据实际情况决定。gcc和g都是GNU(组织)的一个编译器。误区一:gcc只能编译c代码,g只能编译c代码两者都可以&#xff0c;但是请注意&…