【发布时间】:2012-04-22 11:21:15
【问题描述】:
我有以下函数,该函数从连续运行的线程的 run() 中连续调用。
private LinkedList<short[]> playerData = new LinkedList<short[]>();
public synchronized void setPlayerData(short[] buffer) {
// Log.i(LOG_TAG, "Inside setData..");
playerData.addLast(buffer);
if (playerData.size() > 10) {
// Log.i(LOG_TAG, "playerData not empty");
playerData.removeFirst();
}
}
现在 DDMS 的 allocation Tracker 说很多对象是在 addLast() 内部创建的(实际上是在 addLastImpl() 内部),因此我想明确删除这些数组,以便它们是堆中总是有足够的内存。现在,
- System.gc() 选项没有帮助,因为它会在每次调用 setPlayerData() 时同时被调用。
- GC_CONCURRENT 正在占用所有 CPU 周期,因为应用程序对时间非常敏感,即使是几毫秒的延迟也是不可接受的。
有关 LogCat 信息,请参阅link,这是我针对整个 synarion 提出的另一个问题。在这个线程中,我只是试图通过将其划分为一组小问题来解决更大的问题。
一种可能的解决方案 一种可能的解决方案是通过删除不需要的数组来显式释放内存空间。但是在 Java 中,我们如何释放由 new 运算符创建的数组?即
short[] buffer = new short[320];
// do some operation on buffer
/// now how can I explicitly free memory by deleting the buffer, when its job is over..
我知道有垃圾收集来处理所有这些事情。但在我的应用中,GC_CONCURRENT 一直在吃光。其他进程因此而被饿死。如果我能够显式释放内存,即在 C++ 中删除,那就太好了。可以在这里查看LogCat信息...A detailed question regarding my problem
编辑 2 3.将数组赋值为null
这有什么帮助?空数组将被安排到垃圾收集中,这是我想避免的,因为该方法是从一个线程连续调用的(每 20 毫秒)。如果我将数组分配为 null,GC_FOR_MALLOC 消息将填充 LogCat...
【问题讨论】:
-
很难理解你到底想要什么。问题是什么?如果问题真的是在询问减少 Android 应用程序中的内存使用量,为什么标题会要求“等同于 C++ 中的 'delete' 运算符”?
-
@AlexLockwood:如果有什么要释放的数组,我可以删除不需要的数组..以减少内存泄漏..
-
在
addLast()中分配的唯一对象是一个Entry对象,用于保存链接和对数组的引用。当您调用removeFirst()时,该对象最终将被释放到 GC。我怀疑你这里有真正的问题。 -
@EJP removeFirst 仅在 size > 10 时调用,并且分配跟踪器显示 addLast() 正如我在问题中提到的那样。我怀疑你是否完整地阅读它......
标签: java android memory-leaks garbage-collection