多次执行应用程序后内存不足

时间:2010-10-05 04:55:54

标签: java android memory-leaks

HI,

有一个奇怪的内存不足错误问题。

我创建了一个解析实时流的类,该类需要缓冲区来保存这些原始数据。

以下是代码段:

/* Initial and uninitial buffer in class */
private final int MAX_BUFFER = 16;
protected byte[][] m_byStreamBuf = null; // Frame buffer
public void InitBuffer() {
  m_byStreamBuf = new byte[MAX_BUFFER][];
  m_byStreamBuf[0] = new byte[512*1024]; // for I Frame
  for (int i = 1; i < MAX_BUFFER; i++) {
    m_byStreamBuf[i] = new byte[256*1024]; // for P frame   
  } 
}

public void UninitBuffer {
  this.m_byStreamBuf = null;
  System.gc();
}

启动和关闭应用程序几次后会发生内存不足错误(实际上可能是三到四次)。

我检查在分配内存的行上发生了错误。

每次关闭应用程序时,我都会尝试调用System.gc()。

但似乎应用程序仍然分配了太多内存并且不会释放所有内存。

感谢您的任何建议。

此致

卡克斯顿

3 个答案:

答案 0 :(得分:0)

  

每次关闭应用程序时,我都会尝试调用System.gc()。

这肯定无济于事。如果垃圾收集器空间不足,它将自动运行垃圾收集器。如果GC未能释放足够的内存,您只能获得OOME。 (实际上,这是一种过度简化......但这超出了你的问题的范围。)

如果你的内存不足,那将是因为有些东西阻止你的应用程序实例在完成后就会消失。也许有一个应用程序在完成时应该做的事情,你的工作没有。

一个hacky修复方法是在您的应用程序完成时将null分配给m_byStreamBuf。但这仍然留下较少的内存泄漏。

答案 1 :(得分:0)

创建弱引用

答案 2 :(得分:0)

这个类本身不应该导致内存不足错误,因为它几乎不使用堆(15 * 256 * 1024 + 512 * 1024 = 4456448 = ~5MB ??)。但是,多个实例会。在你的应用程序的某个地方,也许你正在创建这个类的很多实例而不是正确地发布它们。

由于您还提到在多次重新启动应用程序后会发生这种情况,因此也可能发生内存泄漏。您还可以在此处查看类加载器泄漏http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

这些事情不容易调查,但通常有嫌疑人。祝好运! :)