内存泄漏事故

Tool {

  Wrapper wrapper;

  void write() {

    Future s= this.new Consumer() {wrapper.getList();}

    futures.get()

  }

  Consumer extends Thread

}

Wrapper {

  List list

}

new Tool(new Wrapper(list).write()

 

问题

1 thread 泄漏,consumer - wrapper - list

2 thread long running and cannot be interrupted,线程没法被中断,资源持续引用

 

解决

【调用方】

1 强行中断wrapper与list关系

2 强行中断thread与list关系

【被调用方】

3 让他们用弱引用

4 对于List list = new ArrayList

Tool.data = list

current:

        list = null, 然而这时new ArrayList被tool 引用

advanced: 

        list.clear()

        list = null

只要data不是拷贝的(小概率事件)

Tool.data = new ArrayList;

data.add(list.get(xxx)

...

那么即使Tool.data仍然hold 住new ArrayList,但那个list已经没有元素了

 

 

 

开放性问题:

假如list没用了后drop时遍历其中的引用,全重置为null还会不会泄露

结论:假如Tool使用List的指针或SubList引用,仍然内存泄露,但泄漏的只是List中的那些个reference

List<String> origin = new ArrayList<>();
List<String> mine = origin;
List<String> mine2 = origin.subList(0,1);

假如Tool重搞了一个list去接收,则对象本身泄漏

List<String> mine3 = new ArrayList<>();
for(String tmp : origin) {
mine3.add(tmp);

 

posted on 2024-08-01 21:46  silyvin  阅读(21)  评论(0)    收藏  举报