【发布时间】:2015-09-16 10:32:31
【问题描述】:
当 Android 应用不在前台时,我将事件存储在队列中。事件可能很多,所以我想在达到一定限制时删除最旧的,以避免内存问题。事件可以是不同的类型,我想避免删除某些事件(如果不是真的需要,例如 onTrimMemory())。
public void enqueue(T event) {
synchronized (events) {
if (events.size() > 2000) {
for (int i = 0; i < events.size(); i++) {
if (canRemove(events.get(i))) {
events.remove(i);
break;
}
}
}
events.add(event);
}
}
canRemove(event) 检查 Event 是否是可以删除的东西的 instanceof 并返回 true/false。
过了一会儿 Logcat 给了我:“long monitor contention event with owner method”,过了一会儿 Logcat 报告了
启动阻塞 GC Alloc
等待阻塞的 GC Alloc
将目标 GC 堆从 65MB 限制到 64MB,然后,在收到许多不同的消息后……应用程序崩溃了。
根据我在阅读类似问题 (What might be the cause of "long monitor contention event with owner method"?) 时的理解,问题是我收到了很多事件并在“太多”时间内锁定事件。
所以问题是……我能做什么?我可以通过保存我删除的最后一个位置并下次从中启动 for 循环来对其进行一些优化,但我认为这还不够。或者我可以为不同的事件做不同的队列,这样我总是删除第一个,但我总是需要锁定它。有更好的主意吗?
我忘了说我要声明:private LinkedList events = new LinkedList();
【问题讨论】:
标签: java android garbage-collection queue concurrentmodification