内存泄漏与Android上的HashMap / HashSet

时间:2010-08-16 20:37:12

标签: java android

我有一个Android应用程序,我使用HashMap,我保持每个执行任务的线程(值)(Runnable)。为了识别线程我使用字符串作为键。只要执行通常不会很长的任务,线程就会存活。问题是,在完成并从HashMap中删除之后,它们似乎从未被GC发布(并且它们不会从其他任何地方引用)。如果我创建一个我的应用程序的转储,那么我在内存中的任务就像应用程序的生命周期一样。尝试使用HashSet,但结果相同。

在代码中,我用以下几行开始它们:

Thread image_fetch_thread = new Thread(new ImageFetchTask(image_url, this));

this.running_image_fetch_threads.put(image_url, image_fetch_thread);

image_fetch_thread.start();

稍后他们会被删除:

this.running_image_fetch_threads.remove(image_url);

为什么GC不喜欢收集它们?

3 个答案:

答案 0 :(得分:1)

你确定你的线程实际上正在完成吗?即使您在HashMap中删除了对Thread的引用,如果它实际上没有完成也不会被GC。必须完成run方法才能实现。

答案 1 :(得分:0)

您是否真的实际将其从HashMapHashSet移除?创建转储时集合的size()是什么?

答案 2 :(得分:0)

只要您不将hasmap或hashset声明为弱引用,GC就无法对其执行任何操作,因为您的应用程序具有强引用。我的回答是罗宾已经说过的话。

http://download-llnw.oracle.com/javase/1.4.2/docs/api/java/lang/ref/WeakReference.html