内存泄漏事故
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);
}

浙公网安备 33010602011771号