Java List的SubList使用问题
2021-02-12 04:17
标签:UNC 代码 nts unknown imp too public log file 出现 OOM 的原因是,循环中的 1000 个具有 10 万个元素的 List 始终得不到回收,因为它始终被 subList 方法返回的 List 强引用。 parent 字段就是原始的 List。SubList没有copy一份自己的数据,而是完整的保留了原始的list。 SubList 是原始 List 的视图,并不是独立的 List, SubList 强引用了原始的 List,所以大量保存这样的 SubList 会导致 OOM。 不直接使用 subList 方法返回的 SubList,而是重新使用 new ArrayList,在构造方法传入 SubList,来构建一个独立的 ArrayList。sublist直接释放-》原始的list也被释放。 另外一个例子 可以看到,移除sublist的元素后,直接影响到了原始list。 modCount 的字段,表示结构性修改的次数--影响list size修改测次数,add肯定影响size,导致modCount加1.但是sublist的modCount没有变,所有抛出了异常。 Java List的SubList使用问题 标签:UNC 代码 nts unknown imp too public log file 原文地址:https://www.cnblogs.com/Brake/p/12732929.html一、Sublist导致OOM
代码
@Slf4j
public class SubListDemo {
public static void subListOOM() {
List
> data = new ArrayList();
for (int i = 0; i ) {
List
OOM
Exception in thread "File Watcher" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.io.File.listFiles(File.java:1212)
at org.springframework.boot.devtools.filewatch.FolderSnapshot.collectFiles(FolderSnapshot.java:63)
at org.springframework.boot.devtools.filewatch.FolderSnapshot.collectFiles(FolderSnapshot.java:67)
at org.springframework.boot.devtools.filewatch.FolderSnapshot.collectFiles(FolderSnapshot.java:67)
at org.springframework.boot.devtools.filewatch.FolderSnapshot.collectFiles(FolderSnapshot.java:67)
at org.springframework.boot.devtools.filewatch.FolderSnapshot.
分析
public List
解决
public static void subListWithoutOOM() {
List
> data = new ArrayList();
for (int i = 0; i ) {
List
public static void removeSubList() {
List
2345678910
二、修改原始列表后SubList循环报错
测试代码
public static void addItemToOriginalList() {
List
java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1239)
at java.util.ArrayList$SubList.listIterator(ArrayList.java:1099)
at java.util.AbstractList.listIterator(AbstractList.java:299)
at java.util.ArrayList$SubList.iterator(ArrayList.java:1095)
at java.lang.Iterable.forEach(Iterable.java:74)
at com.example.newdemo.SubListDemo.addItemToOriginalList(SubListDemo.java:46)
at com.example.newdemo.NewdemoApplication.main(NewdemoApplication.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
分析
代码
private void checkForComodification() {
if (ArrayList.this.modCount != this.modCount)
throw new ConcurrentModificationException();
}
文章标题:Java List的SubList使用问题
文章链接:http://soscw.com/index.php/essay/54293.html