我有以下函数,它从连续运行的线程的 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 的分配跟踪器说很多对象是在 addLast() 内部创建的(实际上是在 addLastImpl() 内部),因此我想明确删除这些数组,以便它们在堆中始终有足够的内存。现在,
- System.gc() 选项无济于事,因为每次调用 setPlayerData() 时都会同时调用它。
- GC_CONCURRENT 占用了所有的 CPU 周期,因为应用程序对时间非常敏感,即使是几毫秒的延迟也是不可接受的。
有关 LogCat 信息,请参阅链接,这是我解决整个 synarion 的另一个问题。在这个线程中,我只是试图通过将它分成一组小问题来解决这个更大的问题。
一个可能的解决方案一个可能的解决方案是通过删除不需要的数组来显式释放内存空间。但是在 Java 中,我们如何释放由操作符创建的数组new
呢?IE
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 信息...关于我的问题的详细问题
编辑 2 3. 将数组分配给 null
这有什么帮助?空数组将被安排到垃圾收集中,这是我想避免的,因为该方法是从一个线程连续调用的(每 20 毫秒)。如果我将数组分配给 null,GC_FOR_MALLOC 消息将填充 LogCat ...